来自文档:
READ_ONLY 将此属性设置为True可确保在序列化表示时使用该字段,但在反序列化期间更新实例时不使用该字段。
默认为False
需要 通常,如果在反序列化期间未提供字段,则会引发错误。如果在反序列化期间不需要此字段,则设置为false。
默认为True。
所以我有一个模型,其中有一个不可为空的字段,但我希望它在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方法未执行,任何想法?
答案 0 :(得分:36)
是的,我也在某个时候遇到过这个问题。您还需要更新验证排除项。
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']
答案 1 :(得分:12)
如果某人遇到类似问题,请注意以下属性以及required
:
如果设置为
True
,则应将空字符串视为有效值。
如果将
None
传递给序列化程序字段,通常会引发错误。
通常,如果在反序列化期间未提供字段,则会引发错误。
我正在努力弄清楚为什么我在required=False
错过了allow_null
属性时收到验证错误。
答案 2 :(得分:3)
迟到这个帖子。此问题已在django-rest-framework 2.3.13中修复。这是PR。
的链接答案 3 :(得分:2)
如果您要设置required=False
的字段之一具有unique_together约束,则需要在序列化器Meta之类的validators=[]
中设置class FavoriteListSerializer(serializers.ModelSerializer):
owner = serializers.IntegerField(required=False)
class Meta:
model = models.FavoriteList
validators = []
@import "variables";
@import "reset";
@import "components/button" <-- your button scss should be under the variables
这是原始的answer
答案 4 :(得分:1)
您也可以这样做:
class ASerializer(serializers.HyperlinkedModelSerializer):
owner = serializers.HiddenField(default=serializers.CurrentUserDefault())
...
如此处所述:https://www.django-rest-framework.org/api-guide/validators/#advanced-field-defaults
在这里您还可以找到想要让视图显示owner
答案 5 :(得分:0)
我想方法.get_validation_exclusions()已被删除。我没有在ModelSerializer doc中找到它,并且它在覆盖(djangorestframework == 3.8.2)之后没有执行。 And i am not the only one facing this problem。
我的解决方案是为不需要的字段添加默认值。应该专门用于具有pre_save的情况:
class FavoriteListSerializer(serializers.ModelSerializer):
owner = serializers.IntegerField(default='')
class Meta:
model = models.FavoriteList
您还必须记住,使用带有pre_save信号的drf串行器可能会导致隐式行为(我没有检查,但这似乎是合乎逻辑的):
pre_save
在对象保存前被调用(令人难以置信),这很可能意味着在序列化程序验证之后。
答案 6 :(得分:0)
在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}}