Сериализатор Django не поднимает исключение при ограничениях модели

У меня есть эта фиктивная модель

from django.db import models
class ChertModel(models.Model):
    username = models.CharField(gettext_lazy('username'), max_length=150, unique=True)
    o2 = models.CharField(gettext_lazy('username2'), max_length=150,editable=False, default='lllss')

и с сериализатором

class ChertSer(serializers.ModelSerializer):
    class Meta:
        model = ChertModel
        fields = ['username','o2']

обратите внимание, что у меня есть экземпляр с username='sd' и o2='434as'

поэтому когда в представлении я хочу обновить o2 поля, которые предположительно editable=False оно не обновляет их, что нормально, но проблема в том, что оно не поднимает исключение из-за ограничений модели.

примечание Я проверил эту конфигурацию с помощью editable=True и сериализатор применяет изменения, таким образом, нет проблем с сериализатором.

class ChertView(views.APIView):
    def get(self, request):
        lt1=ChertModel.objects.get(username='sd')
        print('1',lt1.o2)
        ser=ChertSer(instance=lt1, data={'username':'sd','o2':'newo2'}, partial=True)
        print(ser.is_valid())
        ser.is_valid(raise_exception=True)
        ser.save()
        lt1=ChertModel.objects.get(username='sd')
        print('2',lt1.o2)

поскольку он показывает serializer.is_valid True и не вызывает исключения, это создаст проблему того, что изменения пользователя не применяются к экземпляру модели без подтверждения этого пользователем.

Итак, мой вопрос заключается в том, как определить моменты, когда объект обновления не применяется из-за ограничений модели?

Конечно, я могу вручную определить это, проверив ser.data=={'username':'sd','o2':'newo2'}, но ser.data можно сделать только после сохранения экземпляра, а не до него. Кроме того, этот способ не определяет ограничение, которое не применяется. Эквивалентом является ручная проверка всех атрибутов, что нежелательно при использовании фреймворка.

Итак, существует ли более формальный или общий способ автоматического обнаружения непримененных ограничений перед сохранением экземпляра?

Если False, поле не будет отображаться в админке или любой другой ModelForm. Они также пропускаются при валидации модели. По умолчанию - True.

Валидация на поле perticuler пропускается по умолчанию, что вы можете сделать, это переписать функцию validation в сериализаторе и поднять исключение из них.

Когда указано editable=False. Поле не будет отображаться в админке или любой другой ModelForms, они также пропускаются при валидации.

Вы можете указать read_only_fields на уровне сериализатора.

class ChertSer(serializers.ModelSerializer):
    class Meta:
        model = ChertModel
        fields = ['username','o2']
        read_only_fields = ('o2',)

Если для этой модели существует несколько сериализаторов, и вы не хотите дублировать их добавление. Вы можете определить поля только для чтения в AbstractSerializer и наследовать его над serializer.

Вернуться на верх