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

Jam*_*Lin 27 python django rest django-rest-framework

从文件:

read_only将此属性设置为True可确保在序列化表示时使用该字段,但在反序列化期间更新实例时不使用该字段.

默认为False

required如果在反序列化期间未提供字段,通常会引发错误.如果在反序列化期间不需要此字段,则设置为false.

默认为True.

所以我有一个模型,它有一个不可空的字段,但我希望它在pre_save方法中填充,所以我将字段设置为required=False序列化器,但似乎不起作用.保存记录时我仍然收到错误.

class FavoriteListSerializer(serializers.ModelSerializer):
    owner = serializers.IntegerField(required=False)
    class Meta:
        model = models.FavoriteList
Run Code Online (Sandbox Code Playgroud)

更新:我已添加serializer_class = serializers.FavoriteListSerializer到ViewSet,现在而不是获取This field is required,我认为已通过验证,但后来我得到了This field cannot be null.检查pre_save方法没有被执行,任何想法?

Kev*_*one 37

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

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']
Run Code Online (Sandbox Code Playgroud)

  • 我向作者提出了一个问题并且已被接受.https://github.com/tomchristie/django-rest-framework/issues/1257 (8认同)
  • 谢谢,我仍然认为这是一个缺陷/不完善的文件. (4认同)

Wto*_*wer 14

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

allow_blank:

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

allow_null:

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

要求:

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

我正在争先恐后地弄清楚为什么required=False我在错过allow_null属性的地方得到验证错误.

  • 还检查数据库是否具有带有NOT NULL选项的列。 (2认同)

Pan*_*hal 6

延迟进入该线程。此问题已在django-rest-framework 2.3.13中修复。这是PR的链接。

在这种情况下,您可以这样使用它:

    class Meta:
        model = models.FavoriteList
        optional_fields = ['owner', ]
Run Code Online (Sandbox Code Playgroud)

  • 这个在当前版本中似乎已经不存在了。 (3认同)

Ill*_*huk 6

2020 年,对于DRF 3.12.x,我更喜欢依赖于 Serializer 的 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}}
Run Code Online (Sandbox Code Playgroud)