2017-01-29 23 views
2

ネストされたシリアライゼーションを持つオブジェクトを作成しようとしており、それに関連する他のオブジェクトも作成されています。私はModelSerializerののcreate()メソッドをオーバーライドし、メインオブジェクトが正常に作成されました。シリアル化エラー:タイプが正しくありません。期待されたpk値が受信されました

def create(self, validated_data): 
     post_data = validated_data.pop('post_set') 
     big_post = BigPost.objects.create(**validated_data) // This works 
     for post in post_data: 
      e = PostSerializer(data=post) 
      if e.is_valid(): 
       e.save() 
      else: 
       print(e.errors) // Prints 'Incorrect type' error 
     return big_post 

ネストされたオブジェクト(ポスト)を作成しようとしたときしかし、私はこのエラーを取得:以下に示すように

{'note': ['Incorrect type. Expected pk value, received Note.']}

'注意' をPostSerializerのフィールドです:

class PostSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Post 
     fields = ('id', 'note', 'title', 'description') 

ModelSerializerのデフォルトの動作は、モデルの関連フィールドのPrimaryKeyRelatedFieldを作成することです。しかし、私は、送信されたデータがちょうどPKのようなものであるときにインスタンスが作成されている理由を知らない。{"note":3、....}

+0

解決策を試しましたか? –

答えて

2

シリアライザが正しく定義されていれば、 validated_dataを2回目に非直列化する必要があります。

ドキュメント:http://www.django-rest-framework.org/api-guide/serializers/#writable-nested-representations

は、このコードを試してみてください。

class PostSerializer(serializers.ModelSerializer): 
    ... 

class BigPostSerializer(serializers.ModelSerializer): 
    posts = PostSerializer(source='post_set', many=True) 

    def create(self, validated_data): 
     post_data = validated_data.pop('post_set') 
     big_post = BigPost.objects.create(**validated_data) 

     for post in post_data: 
      e = Post.objects.create(bigpost=big_post, **post) 

     return big_post 

bigpostは - BigPostへの外部キーの名前です。

+0

こんにちは、私はこれを行うことができ、それを実装するドキュメントの例を見ていることを知っています。しかし、ネストされたシリアライザを呼び出すことでこれを行う方法があることを期待していました。これは、 'post_data'の内部に作成する必要のある別のネストされたオブジェクトがあるためです。また、シリアライザにネストされたオブジェクトの検証を強制したいと思います。 – zubhav

+0

例のようにシリアライザをネストするだけです。 –

+0

私は現在自分のコードに似ていますが、createメソッドではPost.object.create()を使用しています。一方、私はPostSerializer(データ)を.save()で使用したいと思います。これにより、PostSerializerのcreate()が呼び出され、別のPostSerializerが呼び出されます。私はこれが理にかなってほしい。 – zubhav

関連する問題