Сериализатор 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
можно сделать только после сохранения экземпляра, а не до него. Кроме того, этот способ не определяет ограничение, которое не применяется. Эквивалентом является ручная проверка всех атрибутов, что нежелательно при использовании фреймворка.
Итак, существует ли более формальный или общий способ автоматического обнаружения непримененных ограничений перед сохранением экземпляра?
Валидация на поле 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.