【问题标题】:Django REST Framework serializer field required=falseDjango REST Framework 序列化程序字段必需=false
【发布时间】:2013-11-15 20:08:56
【问题描述】:

来自文档:

只读 将此设置为 True 以确保在序列化表示时使用该字段,但在反序列化期间更新实例时不使用该字段。

默认为假

必填 如果在反序列化期间未提供字段,通常会引发错误。如果在反序列化期间不需要此字段,则设置为 false。

默认为真。

所以我有一个模型,它有一个不可为空的字段,但我希望它在 pre_save 方法中填充,所以我在序列化程序中将该字段设置为 required=False,但似乎不起作用。保存记录时仍然出现错误。

class FavoriteListSerializer(serializers.ModelSerializer):
    owner = serializers.IntegerField(required=False)
    class Meta:
        model = models.FavoriteList

更新: 我已将 serializer_class = serializers.FavoriteListSerializer 添加到 ViewSet,而不是获取 This field is required,我认为它通过了验证,但后来我得到 This field cannot be null. 我检查了 pre_save 方法没有被执行,有什么想法吗?

【问题讨论】:

    标签: python django rest django-rest-framework


    【解决方案1】:

    是的,我也曾在某个时候遇到过这个问题。您还需要更新验证排除项。

    class FavoriteListSerializer(serializers.ModelSerializer):
        owner = serializers.IntegerField(required=False)
        class Meta:
            model = models.FavoriteList
    
        def get_validation_exclusions(self):
            exclusions = super(FavoriteListSerializer, self).get_validation_exclusions()
            return exclusions + ['owner']
    

    【讨论】:

    【解决方案2】:

    延迟进入此线程。此问题已在 django-rest-framework 2.3.13 中修复。这是PR的链接。

    在你的情况下你是这样使用它的:

        class Meta:
            model = models.FavoriteList
            optional_fields = ['owner', ]
    

    【讨论】:

    • 我已经编辑了这个以添加一个示例以防万一。您应该“向上” 40 倍才能排在首位,因为get_validation_exclusions() 的答案不再有效(它从未被调用过,PyCharm 说除了我的声明之外没有其他声明,所以这不是正确的解决方案)。跨度>
    • 我猜你的意思是 10 倍。 40x 将是 160,即 4 乘以 40。我无能为力到达那里?。感谢您添加示例,顺便说一句。
    【解决方案3】:

    如果有人遇到类似问题,请注意以下属性以及required

    allow_blank

    如果设置为True,则空字符串应被视为有效值。

    allow_null:

    如果将None 传递给序列化器字段,通常会引发错误。

    required:

    如果在反序列化过程中未提供字段,通常会引发错误。

    我正在努力弄清楚为什么我在required=False 中遇到了验证错误,而我错过了allow_null 属性。

    【讨论】:

    • 还要检查数据库是否有带有 NOT NULL 选项的列。
    【解决方案4】:

    2020 年,对于 DRF 3.12.x,我更喜欢依赖的方法 Serializer's extra_kwargs.

    所以假设你的

    class FavoriteListSerializer(serializers.ModelSerializer):
        owner = serializers.IntegerField(required=False)
        class Meta:
            model = models.FavoriteList
            fields = ["owner"]  # and whatever other fields you want to expose
            extra_kwargs = {"owner": {"required": False, "allow_null": True}}
    

    【讨论】:

      【解决方案5】:

      如果您尝试设置 required=False 的字段之一具有 unique_together 约束,则需要在类似序列化程序 Meta 中设置 validators=[]

      class FavoriteListSerializer(serializers.ModelSerializer):
          owner = serializers.IntegerField(required=False)
          class Meta:
              model = models.FavoriteList
              validators = []
      

      这里是原文answer

      【讨论】:

        【解决方案6】:

        您也可以这样做:

        class ASerializer(serializers.HyperlinkedModelSerializer): 
            owner = serializers.HiddenField(default=serializers.CurrentUserDefault())
        
            ...
        

        这里提到:https://www.django-rest-framework.org/api-guide/validators/#advanced-field-defaults 当你也想让视图显示时,你也可以在那里找到案例owner

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-06
          • 1970-01-01
          • 2013-07-07
          • 1970-01-01
          相关资源
          最近更新 更多