Django REST Framework 序列化程序字段必需=false

Posted

技术标签:

【中文标题】Django REST Framework 序列化程序字段必需=false【英文标题】:Django REST Framework serializer field required=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 方法没有被执行,有什么想法吗?

【问题讨论】:

【参考方案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']

【讨论】:

嗯,我明白了,根据您的回答,我尝试将 validators=[] 添加到序列化程序字段,但仍然无法正常工作。这种事情不像宣传的那样工作...... 您是否添加了get_validation_exclusions() 方法?它会覆盖模型上的现有验证。 谢谢,根据文档,我仍然认为这是一个缺陷/不完美。 倾向于同意,你应该在项目上留下问题github.com/tomchristie/django-rest-framework/issues?state=open 我向作者提出了一个问题,它被接受了。 github.com/tomchristie/django-rest-framework/issues/1257【参考方案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

【讨论】:

以上是关于Django REST Framework 序列化程序字段必需=false的主要内容,如果未能解决你的问题,请参考以下文章

python django-rest-framework 3.3.3 更新嵌套序列化程序

django-rest-framework、多表模型继承、ModelSerializers 和嵌套序列化器

Django.rest_framework:如何序列化一对多?

Django 序列化器与 rest_framework 序列化器

Django-Rest-Framework 中的序列化程序问题

django.core 序列化器和 Django Rest Framework 序列化器之间的区别