6

У меня есть такой случай, когда у вас есть собственное вложенное отношение сериализатора к уникальному полю. Пример случая:Уникальная проверка на вложенном сериализаторе на платформе Django Rest

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) 

Проблема: Когда я пытаюсь сохранить объект JSON, как { «имя»: «Князь», «жанр»: { «имя»: «История»}} DRF попробовать для проверки уникального ограничения объекта жанра, и если «История» существует, я выбрал исключение, потому что жанр с именем «История» должен быть уникальным, и это правда, но я просто пытаюсь связать объект, а не создавать вместе.

Спасибо вам большое!

ответ

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, а не создание экземпляра книги? Еще раз спасибо! –

+1

Это должно быть частью второго шага проверки - скажите в части создания/обновления, подняв ValidationError. – Linovia

+0

Это было очень полезно! Большое спасибо! –