Django-REST-框架对字段"required"选项的澄清



我有以下序列化程序:

class ReqSerializer(serializers.ModelSerializer):
      class Meta:
           model = Earth
           fields = ('area', )

而这个模型:

class Earth(models.Model):
      area = models.IntegerField(default=0)

根据 django-rest-framework Serializer 字段,"必需"选项是默认情况下设置为 True,这意味着如果我尝试验证输入中没有"area"字段的序列化程序,我应该得到This field is required错误。但是传递is_valid()并使用默认area=0创建模型。但是,使用它:

 extra_kwargs = {
     area': {'required': True},
 }

会解决问题,但为什么?什么可以改变这种行为?为什么默认为"必需=真"没有效果?

更新:我刚刚注意到,如果我从模型中删除default=0,它将按预期工作。现在的问题是为什么在模型字段上设置默认值会取消序列化程序上的required=True

我相信

你这里的问题是该字段是由 Django REST 框架自动生成的,而文档是从您在序列化程序上手动创建字段的角度来的。

根据 django-rest-framework 序列化程序字段,"必需"选项默认设置为 True

这对于您在序列化程序上自行指定的字段是正确的。在自动生成字段的情况下,Django REST 框架尝试确定与模型字段最匹配的序列化程序字段选项,类似于 Django 表单对表单字段所做的方式。对于序列化程序字段,目前基本上没有记录,因此我无法指出您。

但是传递 is_valid() 并且使用默认 area=0 创建模型。

这是因为 Django REST 框架确定该字段具有默认值,此时知道输入不是严格必需的,因为如果用户不传入任何内容,模型字段将自动给出默认值。当然,如果在创建时将某些内容传递到序列化程序中,则将使用该值而不是默认值,这是手动创建模型时所期望的。

会解决问题,但为什么?什么可以改变这种行为?为什么默认的"必需=真"不起作用?

这将解决您的问题,因为它会手动覆盖在自动生成的序列化程序字段上设置的required=False。在 Django REST 框架 3.0 中,你可以通过调用 repr(ReqSerializer()) 并查看自动生成的字段来确认这一点。

我刚刚注意到,如果我从模型中删除 default=0,它将按预期工作。

这是因为 Django REST 框架不再确定默认值并将required=True添加到序列化程序,就像你期望的那样。

最新更新