Уникальный валидатор в drf

#python #django #serialization #django-rest-framework

#питон #джанго #сериализация #django-rest-framework

Вопрос:

у моей модели есть поле:

 name = models.CharField(max_length=255, blank=True, null=True)
 

в сериализаторе я пытаюсь вызвать уникальную ошибку проверки

 name = serializers.CharField(validators=[UniqueValidator(queryset=Department.objects.all(),
                                        message=("Name already exists"))])
 

но это не работает, потому что данные поступают в сериализатор в таком формате name: {en: "drink"} , в котором поля БД заполняются drink только.

Я могу вызвать ошибку в create методе, но я хочу вызвать ошибку в сериализаторе. ценю любые советы. Я очень спешу. приносим извинения за любые неудобства.

Заранее спасибо

Ответ №1:

Я бы настоятельно рекомендовал вам использовать проверку на уровне поля сериализатора Django Rest Framework, которая позволяет выполнять пользовательскую проверку для вашего поля.

например, следующее:

     name = serializers.CharField()
    ...
    def validate_name(self, value):
        # I assumed that you will that the string value, is a JSON object.
        entered_name = json.loads(value).get('en', None)
        if entered_name and Department.objects.filter(name__exact=entered_name).exists():
            raise serializers.ValidationError("Name already exists!")
        # You need to return the value in after validation.
        return value
     ...

 

Комментарии:

1. Огромное спасибо за ответ! это похоже на то, что я искал. Дело в том, что когда я пытаюсь реализовать этот код, он никогда не достигает этой проверки. В чем может быть проблема?

Ответ №2:

Вы можете сделать это ниже вашего мета-класса в Serializers.py поскольку это вызовет сообщение об ошибке, имя ошибки должно быть уникальным

 class Meta:
    model = YourModel

    fields= ('name',) 
    extra_kwargs = {
                'name': {
                    'validators': [
                        UniqueValidator(
                            queryset=YourModelName.objects.all()
                        )
                    ]
                }
            }
 

Ответ №3:

мне не удалось использовать UniqueValidator , поэтому я взломал UniqueTogetherValidator .

Вот так;

импортируйте его:

from rest_framework.validators import UniqueTogetherValidator

затем:

 class NameSerializer(serializers.ModelSerializer):
    class Meta:
        model = NameOfModel
        fields = ['id', 'name']
        validators = [
            UniqueTogetherValidator(
                queryset=NameOfModel.objects.all(),
                fields=['name']
            )
        ]
 

Если вы хотите, чтобы поле имени было уникальным.

Ссылка: [Здесь]:https://www.django-rest-framework.org/api-guide/validators/#uniquetogethervalidator