当我尝试通过我的项目API创建一个带有foreignkey的对象(在本例中为2)时,tastypie也尝试创建相关对象(此处为order& participant):
class ParticipationResource(ModelResource):
order = fields.ForeignKey(Order, 'order', full=True,)
participant = fields.ForeignKey(UserProfile, 'participant', full=True)
class Meta:
authorization = Authorization()
queryset = Participation.objects.all()
resource_name = 'participation'
fields = ['id', 'order', 'participant', 'products', 'created_at', 'modified_at']
filtering = {
'participant': ALL
}
detail_allowed_methods = ['get', 'post', 'put', 'delete',]
always_return_data = True
发布的数据:
{
"order": {
"id":"1",
"resource_uri":"/api/v1/order/1/"
...
},
"participant":{
"id":"1",
"resource_uri":"/api/v1/participant/1/"
...
},
"products":[]
}
错误消息(network_id是用户配置文件模型上的外键):
"error_message": "app_user_profile.network_id may not be NULL",
正如你所看到我在我的POST请求中发送完整的对象,我只尝试了resource_uri并且工作正常,问题是我需要完整的客户端渲染对象(我正在使用Backbone和模型自动呈现)。那我该怎么办?有没有办法让tastypie不创建相关对象?
答案 0 :(得分:6)
当您为Tasty = True配置TastyPie时,它可以双向工作 - 它返回完整的嵌套对象,但也接受完整的嵌套对象。
您需要做的是将Backbone配置为不发送嵌套对象的完整JSON,而只发送resource_uri。
有几种方法可以做到这一点 - 一种方法是使用Backbone-Relational来处理嵌套模型的解析和创建 - 所以你不必进行自定义解析()。
另一个是使用Backbone-Tastypie(由同一作者),它是Backbone-Relational代码的一个子集,可以更容易地使用TastyPie。
但是,如果你想坚持你拥有的东西,你需要编写一个自定义toJSON函数,只返回resource_uri而不是嵌套对象。
这使Backbone模型保持不变,但是当它们被序列化发送到服务器时,只使用了资源uri:
{
"order": "/api/v1/order/1/",
"participant":"/api/v1/participant/1/",
"products":[]
}