Невозможно изменить сообщение об ошибке проверки поля в сериализаторе модели

Я работаю над ModelSerializer Я столкнулся с этими проблемами ниже.

1) Невозможно проверить метод .validate(self, data), так как я хочу вернуть собственное сообщение валидатора, которое не работает.

модель.py

class BlogModel(models.Model):

    BLOG_STATUS = (
        ('PUBLISH', 'Publish'),
        ('DRAFT', 'Draft'),
    )

    blog_id = models.AutoField(primary_key=True)
    user = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name='blogs')
    title = models.CharField(max_length=255)
    content = models.TextField(blank=True, null=True)
    status = models.CharField(max_length=7, choices=BLOG_STATUS)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta():
        db_table = 'blogs'
        verbose_name = 'Blog'
        verbose_name_plural = 'Blogs'

    def __str__(self):
        return self.title

сериализаторы.py


import datetime
from django.contrib.auth.models import User
from django.utils.timezone import now
from rest_framework import serializers
from rest_framework.serializers import ModelSerializer,Serializer
from blogs.models import BlogModel, BlogFilesModel

class UserSerializer(ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'
        # exclude = ['password']


class BlogFilesSerializer(ModelSerializer):
    count_files = serializers.IntegerField(required=False)

    class Meta:
        model = BlogFilesModel
        fields = ('blog_files_id', 'blog', 'path',
                  'created_at', 'updated_at', 'count_files')

    def get_path(self, obj):
        formatted_date = obj.created_at.strftime("%d-%m-%Y")
        return formatted_date

class BlogSerializer(ModelSerializer):
    blog_files = serializers.SerializerMethodField()

    def get_blog_files(self, obj):
        info = BlogFilesSerializer(BlogFilesModel.objects.filter(
            blog=obj).order_by('-pk'), many=True)

        if info.data:
            for i in info.data:
                user_detail = User.objects.get(pk=obj.user.id)
                i.__setitem__('user_detail', UserSerializer(user_detail).data)
                if i.get('user_detail'):
                    try:
                        del i['user_detail']['password']
                    except expression as identifier:
                        pass

        return info.data

    blog_created_at=serializers.SerializerMethodField()

    def get_blog_created_at(self, obj):
        formatted_date=obj.created_at.strftime("%d-%m-%Y")
        return formatted_date

    def validate(self, data):
        if data.get('title') == "":
            #this below error message not showing
            raise serializers.ValidationError("Title field must not be left blank.") 
        return data

    def validate_title(self, value):
        if value != "Hello":
            raise serializers.ValidationError("Title field must be 'Hello' ")
        return value

    def validate_content(self, value):
        if len(value) < 2:
            raise serializers.ValidationError("Content must have at least 2 letters")
        return value

    class Meta:
        model=BlogModel
        fields=('blog_id', 'user', 'title', 'content',
                  'status', 'blog_files', 'blog_created_at')


просмотры.py


class BlogViewSet(viewsets.ModelViewSet):
    queryset = BlogModel.objects.all()
    lookup_field = 'blog_id'
    serializer_class = BlogSerializer

ниже скриншот моего вывода

Невозможно изменить сообщение об ошибке проверки поля в сериализаторе модели

Надежда хорошо объяснила мою проблему.

Спасибо.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
1 668
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете определить extra_kwargs в классе Meta вашего сериализатора, чтобы настроить сообщения об ошибках. https://www.django-rest-framework.org/api-guide/serializers/#additional-keyword-arguments

В вашем случае вы должны добавить это в BlogSerializer:

    extra_kwargs = {
        'title': {
            'error_messages': {
                'blank': 'my custom error message for title'
            }
        }
    }

Сложная часть может заключаться в том, чтобы выяснить ключ, который вам нужно переопределить. Получение ошибок, вызванных валидаторами в сериализаторе, может быть выполнено в оболочке django. Например.

serializer = BlogSerializer(data = {'title':''})
serializer.is_valid()
serializer._errors

{'status': [ErrorDetail(string=u'This field is required.', code=u'required')]
 'title': [ErrorDetail(string=u'This field may not be blank.', code=u'blank')
 'user': [ErrorDetail(string=u'This field is required.', code=u'required')]}

ErrorDetail.code — это ключ для словаря error_messages. В данном случае это «пусто».

Другие вопросы по теме