[英]POST multiple objects in one TastyPie API request
如果可能的話,我想在一個帖子請求中創建多個相關對象。 我有一個有多個游戲的應用程序,我想在數據庫中發布每個游戲的應用程序活動。
模型中的每個活動對象都有一個游戲對象作為外鍵,因此我需要在創建活動對象之前創建游戲。
{
"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。 我想我可以在一個請求中創建游戲,然后在補丁請求中創建活動,我只是希望可以在一個批處理中完成所有操作。
使用相關名稱作為接受相關對象創建的字段
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可以完成任務。 它映射相關字段的對象,並在創建數據時自動填充關系。
請參閱標題為批量操作的文檔部分。 它始於:
作為優化,可以通過將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/
您可以為活動和使用字段創建資源.ToManyField: https : //django-tastypie.readthedocs.org/en/latest/resources.html#reverse-relationships
這會將URL添加到活動資源中。 要完全內聯活動數據,只需傳遞(full = True,full_list = True)作為ToManyField的參數: https ://django-tastypie.readthedocs.org/en/latest/fields.html#tastypie.fields.RelatedField.full_list
如果游戲資源如下:
class GameResource(ModelResource):
activities = fields.ToManyField(ActivityResource, 'activities', full=True)
按照tastypie文檔中的說明:
Tastypie鼓勵“round-trippable”數據,這意味着您可以獲取的數據應該能夠POST / PUT返回以重新創建相同的對象。 如果您對要發送的內容有疑問,請在另一個對象上進行GET,看看Tastypie認為應該是什么樣子。
您將能夠在一個批次中創建所有。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.