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 序列化器