簡體   English   中英

在一個TastyPie API請求中POST多個對象

[英]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。 我想我可以在一個請求中創建游戲,然后在補丁請求中創建活動,我只是希望可以在一個批處理中完成所有操作。

使用相關名稱作為接受相關對象創建的字段

http://django-tastypie.readthedocs.org/en/v0.10.0/fields.html#tastypie.fields.RelatedField.related_name

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM