django-rest-framework对字段“必需”选项的澄清

时间:2015-01-07 04:06:17

标签: python django-rest-framework

我有以下序列化程序:

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

和这个模型:

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

我相信你的问题是这个字段是由Django REST框架自动生成的,而文档来自你在序列化器上手动创建字段的角度。

  

根据django-rest-framework Serializer字段,默认情况下“required”选项设置为True

这对于您在序列化程序上自己指定的字段是正确的。在自动生成的字段的情况下,Django REST框架尝试确定与模型字段最匹配的序列化器字段选项,类似于Django forms does it for form fields的方式。对于序列化器字段,目前很大程度上没有记录,因此我无法指出任何内容。

  

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

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

  

会解决问题,但为什么?有什么可以改变这种行为?为什么默认的“required = True”没有效果?

这将解决您的问题,因为它会手动覆盖在自动生成的序列化程序字段中设置的required=False。在Django REST framework 3.0中,您可以通过calling repr(ReqSerializer()) and looking at the the automatically generated field确认。

  

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

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