Django Rest框架忽略默认值

evrscar2  于 2022-12-05  发布在  Go
关注(0)|答案(2)|浏览(123)

知道为什么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请求的机制,在用户没有提供默认值时将其更改为默认值?

5kgi1eie

5kgi1eie1#

我认为这是一个小误解。
{'some_field': None}发布到您的API是通知您的序列化程序生成一个MyClass示例,其中some_field设置为None-不使用默认值。它没有使用默认值-因为您正在使用值None对其进行示例化。
如果您要在模型上使用default值,则需要在序列化程序验证期间清除/删除some_field值,以便create()调用不存在此字段,并且将使用默认值。
我是否应该更改POST请求的机制,以便在用户未提供默认值时将其更改为默认值?
这当然是一个解决方案,并且会起作用。但是,除非有很好的文档记录,否则API的外部消费者可能会注意到同样的奇怪行为。

n6lpvg4x

n6lpvg4x2#

我认为主要的问题不过是:您是否在MyClass模型定义中设置了max_length required选项?如果不需要,为什么在本例中不需要它?在字段中,类型的文档应该是必需的。

相关问题