Django REST Framework序列化器字段required = false

时间:2013-11-05 01:58:48

标签: python django rest django-rest-framework

来自文档:

  

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方法未执行,任何想法?

7 个答案:

答案 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

allow_blank

  

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

allow_null

  

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

required

  

通常,如果在反序列化期间未提供字段,则会引发错误。

我正在努力弄清楚为什么我在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}}