2016-07-18 18 views
6

Ich habe einen Fall wie folgt, wo Sie eine benutzerdefinierte geschachtelte Serializer-Beziehung mit einem eindeutigen Feld haben. Musterkoffer:Einzigartige Validierung auf verschachtelten Serializer auf 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) 

Das Problem: Wenn ich versuche, wie ein JSON-Objekt zu speichern { "name": "Der Prinz", "Genre": { "name": "History"}} DRF versuchen um die genre object unique constraint zu validieren und wenn "History" existiert gibt mir eine Ausnahme, weil ein Genre mit dem Namen "History" muss eindeutig sein, und das ist wahr, aber ich versuche nur das Objekt zu beziehen und nicht zusammen zu erstellen.

Vielen Dank !!

Antwort

9

Sie sollten die einzigartige Validator für die verschachtelte Serializer fallen:

class GenreSerializer(serializers.ModelSerializer): 

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

Vielleicht möchten Sie Ihre Serializer drucken, bevor Sie sicher, dass Sie auf diesem Gebiet keine anderen Validatoren haben. Wenn Sie welche haben, müssen Sie sie in die Liste aufnehmen.

Bearbeiten: Wenn Sie die Eindeutigkeitseinschränkung für die Erstellung sicherstellen müssen, sollten Sie dies in der Ansicht tun, nachdem die aufgerufen wurde und vor serializer.save.

+0

Vielen Dank! Aber wenn ich die Validierung im verschachtelten Serializer brauche, wenn ich es zum Speichern von Genre-Instanzen verwende? Gibt es eine Möglichkeit, nur zu prüfen, ob ich eine Genre-Instanz erstelle und nicht, ob ich eine Book-Instanz erstellen möchte? Danke nochmal! –

+1

Das sollte Teil eines zweiten Validierungsschritts sein - sagen wir im create/update Teil, indem wir ValidationError erhöhen. – Linovia

+0

Das war wirklich hilfreich! Vielen Dank! –