django-tastypie尝试在POST请求上创建相关对象

时间:2012-02-10 13:16:55

标签: django api backbone.js tastypie

当我尝试通过我的项目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不创建相关对象?

1 个答案:

答案 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":[]
  }