2016-07-18 22 views
6

私はこのようなケースがあります。このケースでは、独自のネストされたシリアライザ関係が一意のフィールドにあります。サンプルケース:Django Rest Frameworkのネストされたシリアライザでの一意の検証

class GenreSerializer(serializers.ModelSerializer): 

    class Meta: 
     fields = ('name',) #This field is unique 
     model = Genre 

class BookSerializer(serializers.ModelSerializer): 

    genre = GenreSerializer() 

    class Meta: 
     model = Book 
     fields = ('name', 'genre') 

    def create(self, validated_data): 
     genre = validated_data.pop('genre') 
     genre = Genre.objects.get(**genre) 
     return Book.objects.create(genre=genre, **validated_data) 

問題:DRFトライ私は{: "王子"、 "ジャンル":{ "名前" "歴史"} "名前"}のようなJSONオブジェクトを保存しようとするとジャンルオブジェクトの一意性制約を検証するために「履歴」が存在する場合は、名前が「履歴」のジャンルが一意でなければならないため、例外がスローされます。それは本当ですが、オブジェクトを関連付けるだけで、

ありがとうございます!

答えて

9

あなたは、ネストされたシリアライザのための独自のバリデータをドロップする必要があります。

class GenreSerializer(serializers.ModelSerializer): 

    class Meta: 
     fields = ('name',) #This field is unique 
     model = Genre 
     extra_kwargs = { 
      'name': {'validators': []}, 
     } 

あなたは、そのフィールド上の他のバリデータを持っていないことを確認する前に、あなたのシリアライザを印刷することもできます。あなたが何人かいるなら、あなたはそれらをリストに含める必要があります。

編集:作成の一意性の制約を確実にする必要がある場合は、serializer.is_validが呼び出された後、serializer.saveの前にビューで行う必要があります。

+0

ありがとうございました!しかし、もし私がGenreインスタンスを保存するためにそれを使用すると、ネストされたシリアライザで検証が必要なのでしょうか? Genreインスタンスを作成し、Bookインスタンスを作成する場合にのみ作成するかどうかを確認する方法はありますか?ありがとうございました! –

+1

これは、2番目の検証ステップの一部である必要があります。たとえば、ValidationErrorを生成して作成/更新部分を作成します。 – Linovia

+0

これは本当に役に立ちました!大いに感謝する! –

関連する問題