2

当我尝试通过我的项目 API 使用外键(在本例中为 2)创建一个对象时,tastepie 也尝试创建相关对象(此处的订单和参与者):

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,模型是自动渲染)。那我该怎么办?有没有办法告诉tastepie不要创建相关对象?

4

1 回答 1

6

当您将 TastyPie 配置为 full=True 时,它​​可以双向工作 - 它返回完整的嵌套对象,但也接受完整的嵌套对象。

您需要做的是将 Backbone 配置为不发送嵌套对象的完整 JSON,而仅发送 resource_uri。

有几种方法可以做到这一点——一种方法是只使用负责解析和创建嵌套模型的Backbone-Relational——因此您不必执行自定义 parse()。

另一个是使用Backbone-Tastypie(由同一作者编写),它是 Backbone-Relational 代码的子集,可以更轻松地使用 TastyPie。

但是,如果你想坚持你所拥有的,你需要编写一个自定义的 toJSON 函数,它只返回 resource_uri 而不是嵌套对象。

这使主干模型保持完整,但是当它们被序列化以发送到服务器时,仅使用资源 uri:

 {
     "order": "/api/v1/order/1/",
     "participant":"/api/v1/participant/1/",
     "products":[]
  }
于 2012-02-10T16:32:18.100 回答