#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