2011-02-17 118 views
7

在我model.pyDjango的保存模型ForeignKey的关系

class Layer(models.Model): 
    user = models.IntegerField() 
    name = models 
    ... 

class Point(models.Model): 
    layers = models.ForeignKey(Layer) 
    meta = models.TextField() 
    ... 

在我view.py

def datasave(request, id): 
    mid = request.POST.get("layerid",default = "") 
    metas = request.POST.get("meta",default = "") 

    cs = Point() 
    cs.layers = mid 
    cs.meta = metas 
    cs.save() 

,但它在我的Django debug..in项目中,我使用GeoDjango内置给出了一个错误,的OpenLayers和ExtJS的...我没有找到任何节能的解决方案我的帖子

我没有做任何的关系与我的外键..基本上我想做出比当i层想要在我的图层中添加一个点,我想用图层ID保存我的点...。

回答

8

发布回溯信息有助于理解您的问题(以便将来的问题)。

它看起来像你对我传递一个号码给您Point实例的属性layers这将导致ValueError。唯一的地方,你可以传递一个数字到一个外键字段是以django形式为你查找的。

您需要改为指定实际的Layer实例。

cs = Point() 
cs.layers = Layer.objects.get(id=mid) 
cs.meta = metas 
cs.save() 
+0

THKS对你有所帮助,但是当我做您的解决方案这给了“featureadd()究竟需要两个参数(1给出)”我怎样才能解决这个问题? – aragon 2011-02-17 15:35:28

+0

我的1行更改不会导致该错误。尽管你可以发布追踪以获得进一步的帮助! – 2011-02-17 15:50:46

13

一种更有效的方式是通过添加“_id”来指定外键底,这样的:

cs = Point(layers_id = mid, meta = metas) 
cs.save() 

不做层= XXX.objects.get(ID = ###)因为这是数据库查询数量的两倍。

ALSO ...你并没有清理你的POST数据,这很危险。取得这样的:

from django import forms 
id_field = forms.IntegerField() 
layer_id = id_field.clean(request.POST.get("layerId", "")