使用backbone.js将外键传递给服务器

时间:2013-01-28 18:20:15

标签: django backbone.js foreign-keys

我有一台使用django和tastypie的服务器以及一个使用backbone.js的基于客户端网络的应用程序,我可以读取数据,但是当我尝试使用外键添加新模型然后同步时问题就出现了。< / p>

所以我认为最简单的方法是调用collection.create,它自动与服务器同步。如果我在没有外键的表上执行此操作,它可以正常工作。但是,当我有一个在服务器数据库上有关系的模型时,我不知道我是如何指定外键的。

模型外键最初采用以下格式:/api/v1/porttype/4/

如果我尝试构建这样的字符串,我会收到404错误,如果我尝试只发送一个int,我会收到404错误。

我不确定服务器的期望。我不确定这是否是一个配置问题......我现在有点迷失了。到目前为止,我做了类似的事情:

collection.create([ { 'project': '/api/v1/porttype/4/', 'name': 'test' } ]);
在这种情况下,

project将是外键。

编辑:我从服务器返回的堆栈跟踪:

{"error_message": "", "traceback": "Traceback (most recent call last)n\n  File \"/Library/Python/2.7/site-packages/django_tastypie-0.9.11-py2.7.egg/tastypie/resources.py\", line 192, in wrapper\n    response = callback(request, *args, **kwargs)\n\n  File \"/Library/Python/2.7/site-packages/django_tastypie-0.9.11-py2.7.egg/tastypie/resources.py\", line 397, in dispatch_list\n    return self.dispatch('list', request, **kwargs)\n\n  File \"/Library/Python/2.7/site-packages/django_tastypie-0.9.11-py2.7.egg/tastypie/resources.py\", line 427, in dispatch\n    response = method(request, **kwargs)\n\n  File \"/Library/Python/2.7/site-packages/django_tastypie-0.9.11-py2.7.egg/tastypie/resources.py\", line 1165, in post_list\n    updated_bundle = self.obj_create(bundle, request=request, **self.remove_api_resource_names(kwargs))\n\n  File \"/Library/Python/2.7/site-packages/django_tastypie-0.9.11-py2.7.egg/tastypie/resources.py\", line 1774, in obj_create\n    bundle = self.full_hydrate(bundle)\n\n  File \"/Library/Python/2.7/site-packages/django_tastypie-0.9.11-py2.7.egg/tastypie/resources.py\", line 698, in full_hydrate\n    value = field_object.hydrate(bundle)\n\n  File \"/Library/Python/2.7/site-packages/django_tastypie-0.9.11-py2.7.egg/tastypie/fields.py\", line 636, in hydrate\n    value = super(ToOneField, self).hydrate(bundle)\n\n  File \"/Library/Python/2.7/site-packages/django_tastypie-0.9.11-py2.7.egg/tastypie/fields.py\", line 154, in hydrate\n    elif self.attribute and getattr(bundle.obj, self.attribute, None)n\n  File \"/Library/Python/2.7/site-packages/Django-1.3.2-py2.7.egg/django/db/models/fields/related.py\", line 301, in __get__\n    raise self.field.rel.to.DoesNotExist\n\nDoesNotExist\n"}

似乎它无法识别它...而且从我搜索的这个django错误中,似乎发生了你在添加时不发送非空字段,但不确定

帮助!

1 个答案:

答案 0 :(得分:0)

为什么不在模型中设置外键,然后在JSON有效负载中发送?例如:

不要以这种方式传递引用:

collection.create([ { 'project': '/api/v1/porttype/4/', 'name': 'test'} ]);

相反,您只需将服务器端的请求作为另一个参数处理。

在骨干方面,我会将上述内容改为:

collection.create([ { 'project_id': 4, 'name': 'test'} ]);

其中project_id是项目表的foreign_key引用

然后,在您的控制器代码中,您需要让ORM处理其余部分。我把它作为练习留给读者: - )