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