首页 文章

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

提问于
浏览
21

从文件:

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方法没有被执行,有什么想法吗?

4 回答

  • 29

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

    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']
    
  • 0

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

    allow_blank

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

    allow_null

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

    required

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

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

  • 3

    迟到这个帖子 . 此问题已在django-rest-framework 2.3.13中修复 . 这是PR的链接 .

  • 8

    我想方法.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
    

相关问题