Подтвердить что ты не робот

Обязательное поле serializer Django REST Framework = false

из документации:

read_only Установите для этого значение Истина, чтобы убедиться, что это поле используется при сериализации представления, но не используется при обновлении экземпляра во время десериализации.

По умолчанию False

требуется Обычно ошибка возникает, если поле не будет предоставлено во время десериализации. Установите значение false, если это поле не требуется присутствовать во время десериализации.

По умолчанию используется значение True.

Итак, у меня есть модель, у которой есть поле, которое не имеет значения NULL, но я хочу, чтобы оно было заполнено в методе pre_save, поэтому я установил поле required=False в сериализаторе, но, похоже, не работает. Я все еще получаю ошибку при сохранении записи.

class FavoriteListSerializer(serializers.ModelSerializer):
    owner = serializers.IntegerField(required=False)
    class Meta:
        model = models.FavoriteList

Обновление: Я добавил serializer_class = serializers.FavoriteListSerializer в ViewSet, теперь вместо получения This field is required, который, я думаю, прошел проверку, но затем я получаю This field cannot be null. Я проверил, что метод pre_save не выполняется, какие-либо идеи?

4b9b3361

Ответ 1

Да, я столкнулся с этим вопросом и в какой-то момент. Вам также необходимо обновить исключения проверки.

class FavoriteListSerializer(serializers.ModelSerializer):
    owner = serializers.IntegerField(required=False)
    class Meta:
        model = models.FavoriteList

    def get_validation_exclusions(self):
        exclusions = super(FavoriteListSerializer, self).get_validation_exclusions()
        return exclusions + ['owner']

Ответ 2

Если кто-то приземляется здесь с подобной проблемой, обратите внимание на следующие атрибуты вместе с required:

allow_blank:

Если установлено значение True, пустая строка должна считаться допустимым значением.

allow_null:

Обычно ошибка возникает, если None передается в поле сериализатора.

required:

Обычно ошибка возникает, если поле не будет предоставлено во время десериализации.

Я расстраивался, чтобы понять, почему я получал ошибку проверки с required=False, где я пропустил атрибут allow_null.

Ответ 3

Поздний вход в эту тему. Эта проблема была исправлена в django-rest-framework 2.3.13. Вот ссылка на PR.

Вы используете это так в вашем случае:

    class Meta:
        model = models.FavoriteList
        optional_fields = ['owner', ]

Ответ 4

Я полагаю, что метод .get_validation_exclusion() теперь удален. Я не нашел его в ModelSerializer doc, и он не выполнялся после переопределения (djangorestframework == 3.8.2). И я не единственный, кто сталкивается с этой проблемой.

Мое решение состоит в том, чтобы просто добавить значение по умолчанию для поля, которое я хочу, чтобы не было обязательным. Это должно быть хорошо специально для ситуаций с pre_save:

class FavoriteListSerializer(serializers.ModelSerializer):
    owner = serializers.IntegerField(default='')
    class Meta:
        model = models.FavoriteList

Вы также должны помнить, что использование сериализаторов drf с сигналами pre_save может вызвать неявное поведение (я не проверял, но это кажется логичным):

pre_save вызывается при сохранении до объекта (невероятно), что (вероятно) означает после проверки сериализатором.