gpt4 book ai didi

django-tastypie 尝试根据 POST 请求创建相关对象

转载 作者:行者123 更新时间:2023-12-02 07:01:08 25 4
gpt4 key购买 nike

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

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 请求中发送了完整的对象,我尝试仅使用 resources_uri 并且工作正常,问题是我需要完整的对象进行客户端渲染(我正在使用 Backbone 和模型会自动渲染)。那我该怎么办呢?有没有办法告诉 tastypie 不要创建相关对象?

最佳答案

当您将 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":[]
}

关于django-tastypie 尝试根据 POST 请求创建相关对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9228380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com