Django Rest Framework игнорирует значение по умолчанию

Есть идеи, почему Django Rest Framework игнорирует значения по умолчанию?

class MyClass(models.Model):
    some_field = models.CharField(default='Yes')

class MyClassSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyCLass
        fields = ['some_field']

class MyClassListCreateAPIView(ListCreateAPIView):
    queryset = MyClass.objects.all()
    serializer_class = MyClassSerializer

Когда я посылаю {'some_field': None} /null/что-то вроде этого. Я всегда получаю:

Bad Request: /myurl/
[02/Dec/2022 16:44:59] "POST /myurl/ HTTP/1.1" 400 114

При изменении на:

class MyClass(models.Model):
        some_field = models.CharField(default='Yes', blank=True, null=True)

работает, но всегда устанавливает значение NULL. Является ли это ожидаемым поведением? Должен ли я изменить механику моего POST запроса, чтобы включить изменение значения на значение по умолчанию, когда пользователь не предоставляет его?

Я считаю, что это небольшое заблуждение.

Постинг {'some_field': None} в ваш API информирует ваш сериализатор о том, что нужно создать экземпляр MyClass с some_field установленным значением None - а не использовать значение по умолчанию. Он не использует значение по умолчанию - потому что вы инстанцируете его со значением None.

Если вы хотите использовать значение default в вашей модели, вам нужно очистить/удалить значение some_field во время валидации сериализатора, чтобы в вызове create() не присутствовало это поле, и использовалось значение по умолчанию.

Нужно ли мне изменить механику POST-запроса, чтобы включить изменение значения на значение по умолчанию, когда пользователь не предоставляет его?

Это, конечно, было бы а решением и могло бы работать. Но если это не будет хорошо документировано - сторонние потребители вашего API могут заметить такое же странное поведение.

Я не думаю, что это основная проблема, но: устанавливаете ли вы опцию max_length required в определении модели MyClass? Если она не нужна, то почему она не нужна в данном случае? В документации к типам полей предполагается, что он должен быть обязательным.

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