【问题标题】:django-rest-framework clarification on field "required" optiondjango-rest-framework 对字段“必需”选项的说明
【发布时间】:2015-01-07 04:06:17
【问题描述】:

我有以下序列化程序:

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

还有这个模型:

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

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

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

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

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

【问题讨论】:

    标签: python django-rest-framework


    【解决方案1】:

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 谢谢凯文。 DRF 要求提供体面的文档。
    猜你喜欢
    • 2013-11-12
    • 2020-02-03
    • 2016-09-18
    • 2013-11-15
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    相关资源
    最近更新 更多