2017-01-29 33 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。

文檔: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()並調用另一個。我希望這是有道理的。 – zubhav

相關問題