如果可能的话,我想在一个帖子请求中创建多个相关对象。我有一个有多个游戏的应用程序,我想在数据库中发布每个游戏的应用程序活动。
模型中的每个活动对象都有一个游戏对象作为外键,因此我需要先创建游戏,然后再创建活动对象。
{
"game": {
"name":"monte",
"app":"/api/v1/app/1/"
},
"activity":{
"type":"eggs",
"score":"0.90",
"game":"_INSERT_MONTE_RESOURCE_URI_HERE_"
},
"activity":{
"type":"spam",
"score":"1.00",
"game":"_INSERT_MONTE_RESOURCE_URI_HERE_"
}
}
有一种简单的方法可以做到这一点,还是我需要从我的应用程序发出3个帖子请求?一个是创建游戏,然后是每个活动一个?
我想也许PATCH会起作用,但后来我意识到当我发送补丁请求时,我不知道要分配给每个活动的游戏资源URI。我想我可以在一个请求中创建游戏,然后在补丁请求中创建活动,我只是希望可以在一个批处理中完成所有操作。
答案 0 :(得分:3)
为接受相关对象创建的字段使用相关名称
RelatedField.related_name
用于帮助在创建数据时自动填充反向关系。默认为无。
为了使此选项正常工作,其他资源上必须有一个字段,并将其作为属性/ instance_name。通常这只是意味着添加一个反射的ToOneField指向后面。
示例:
class EntryResource(ModelResource): authors = fields.ToManyField('path.to.api.resources.AuthorResource', 'author_set', related_name='entry')
class Meta:
queryset = Entry.objects.all()
resource_name = 'entry'
class AuthorResource(ModelResource):
entry = fields.ToOneField(EntryResource, 'entry')
class Meta:
queryset = Author.objects.all()
resource_name = 'author'
使用related_name执行任务。它映射相关字段的对象,并在创建数据时自动填充关系。
答案 1 :(得分:2)
请参阅标题为Bulk Operations的文档部分。它开始于:
作为优化,可以通过将PATCH发送到列表端点,在单个请求中对集合进行多次创建,更新和删除。
以下是他们的例子:
curl --dump-header - -H "Content-Type: application/json" -X PATCH --data '{"objects": [{"body": "Surprise! Another post!.", "pub_date": "2012-02-16T00:46:38", "slug": "yet-another-post", "title": "Yet Another Post"}], "deleted_objects": ["http://localhost:8000/api/v1/entry/4/"]}' http://localhost:8000/api/v1/entry/
答案 2 :(得分:0)
您可以为活动和使用字段创建资源.ToManyField: https://django-tastypie.readthedocs.org/en/latest/resources.html#reverse-relationships
这会将网址添加到活动资源中。要完全内联活动数据,只需将(full = True,full_list = True)作为ToManyField的参数: https://django-tastypie.readthedocs.org/en/latest/fields.html#tastypie.fields.RelatedField.full_list
答案 3 :(得分:0)
如果游戏资源如下:
class GameResource(ModelResource):
activities = fields.ToManyField(ActivityResource, 'activities', full=True)
按照tastypie文档中的说明进行操作:
Tastypie鼓励“round-trippable”数据,这意味着您可以获取的数据应该能够POST / PUT返回以重新创建相同的对象。 如果您对要发送的内容有疑问,请在另一个对象上进行GET操作。看看Tastypie认为应该是什么样子。
您将能够在一个批次中创建所有。