2016-11-12 3 views
0

djangoとdjango-rest-frameworkで次のapiを実装する正しい方法は何ですか?最初のモデルdjango rest frameworkの多対多の関係のidのリストを持つリクエスト

モデル

def ChatModel(models.Model): 
    users = models.ManyToManyField(User, through=ChatUser) 

応答

多くの関係に多くのネストされたシリアライザが提示され、このモデルになっ所望の応答:

[ 
    { 
    "id": 1, 
    "title": "gossip", 
    "users": [ 
     { 
      "id": 1, 
      "name": "George" 
     }, 
     { 
      "id": 2, 
      "name": "Jerry" 
     } 
    ]   
    } 
] 

リクエストは重要な部分です:apiにlis主キーを使用して、バックエンドでユーザー - >チャット関係を作成します。

要求

{ 
    "title": "gossip", 
    "users": [1,2] 
} 

それでは、どのように私は多くの関係に多くを持つオブジェクトを作成するために、このような要求を可能にします。

編集

私は、シリアライザのcreateメソッドをオーバーライドして、ユーザーのフィールドを作るChatRequestSerializerクラスにこの

users = serializers.ListField(child=serializers.PrimaryKeyRelatedField(many=True, queryset=User.objects.all())) 

のようなものを使ってこれを実装し、関係を作成処理するためにしようとしてきました。それがエラーをスローしますので、これは動作しません:「ManyRelatedManager」オブジェクトが

+0

この質問は以上のようなものです。しかし、私はこれをやっている*方法に関連する主要な部分は欠けています。あなたは今まで何をしたことがありますか? –

+0

私はこれまでのことを説明するために私の質問を編集しました – matteok

答えて

0

を反復可能なされていないあなたは、ネストされたシリアライザを使用することができます。

class NestedUserSerializer(serializers.ModelSerializer): 
    class Meta(object): 
     model = models.User 
     fields = ('id', 'name') 
     readonly_fields = ('name',) 


class ParentSerializer(serializers.ModelSerializer): 
    users = NestedUserSerializer(many=True) 

    class Meta(object): 
     model = models.Parent 
     fields = ('id', 'title', 'users') 

    def create(self, validated_data): 
     user_ids = {u['id'] for u in validated_data.pop('users', [])} 
     parent = super(ParentSerializer, self).create(validated_data) 
     # create users here 
     return parent 

コードがテストされていません。しかし私はそれが私の考えを示すことを望む。

その入力は次のようになりますのでご注意ください。

{ 
    "title": "gossip", 
    "users": [{"id": 1}, {"id": 2}] 
} 

はまた、あなたがこの回答を確認することができます。私は*この*持っていると私は*その*ほしい:django rest framework nested fields with multiple models

+0

入力は2つの 'id'キーで不正確です。 – Koterpillar

+0

入力例を修正しました。 – zymud

関連する問題