3

可能であれば、1 回の投稿リクエストで複数の関連オブジェクトを作成したいと考えています。複数のゲームを含むアプリがあり、各ゲームのアプリ アクティビティをデータベースに投稿したいと考えています。

モデル内の各アクティビティ オブジェクトは外部キーとしてゲーム オブジェクトを持っているため、アクティビティ オブジェクトを作成する前にゲームを作成する必要があります。

{
     "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 つの投稿リクエストを行う必要がありますか? ゲームを作成するために 1 つ、次にアクティビティごとに 1 つですか?

PATCH が機能する可能性があると考えていましたが、パッチ リクエストを送信したときに、各アクティビティに割り当てるゲーム リソース URI がわからないことに気付きました。1 回のリクエストでゲームを作成してから、パッチ リクエストでアクティビティを作成できると思いますが、すべてを 1 回のバッチで実行できることを願っています。

4

4 に答える 4

3

関連オブジェクトの作成を受け入れるフィールドに関連名を使用する

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

RelatedField.related_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 を使用してタスクを実行します。関連するフィールドのオブジェクトをマッピングし、データの作成時に関係を自動的に入力します。

于 2013-11-13T07:28:36.667 に答える
0

アクティビティ用のリソースを作成し、フィールドを使用できます。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

于 2013-02-19T09:36:14.780 に答える
0

ゲーム リソースが次のようになっている場合:

class GameResource(ModelResource):
    activities = fields.ToManyField(ActivityResource, 'activities', full=True)

Tastypie のドキュメントの注記に従います。

Tastypie は「ラウンドトリップ可能な」データを奨励しています。つまり、GET できるデータは、POST/PUT で戻して同じオブジェクトを再作成できる必要があります。何を送信すべきか迷った場合は、別のオブジェクトに対して GET を実行し、Tastypie がどのように表示されるべきかを確認してください。

一括で作成できるようになります。

于 2013-02-19T12:45:06.057 に答える