知道为什么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)
这是预期的行为吗?我是否应该改变POST请求的机制,在用户没有提供默认值时将其更改为默认值?
2条答案
按热度按时间5kgi1eie1#
我认为这是一个小误解。
将
{'some_field': None}
发布到您的API是通知您的序列化程序生成一个MyClass
示例,其中some_field
设置为None
-不使用默认值。它没有使用默认值-因为您正在使用值None
对其进行示例化。如果您要在模型上使用
default
值,则需要在序列化程序验证期间清除/删除some_field
值,以便create()
调用不存在此字段,并且将使用默认值。我是否应该更改POST请求的机制,以便在用户未提供默认值时将其更改为默认值?
这当然是一个解决方案,并且会起作用。但是,除非有很好的文档记录,否则API的外部消费者可能会注意到同样的奇怪行为。
n6lpvg4x2#
我认为主要的问题不过是:您是否在MyClass模型定义中设置了
max_length
required选项?如果不需要,为什么在本例中不需要它?在字段中,类型的文档应该是必需的。