58

从文档中:

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

默认为假

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

默认为真。

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

class FavoriteListSerializer(serializers.ModelSerializer):
    owner = serializers.IntegerField(required=False)
    class Meta:
        model = models.FavoriteList

更新:我现在已经添加serializer_class = serializers.FavoriteListSerializer到 ViewSet 中,而不是 getting This field is required,我认为它已经通过了验证,但是我得到了This field cannot be null.我已经检查了 pre_save 方法没有被执行,有什么想法吗?

4

6 回答 6

56

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

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']
于 2013-11-05T08:09:35.473 回答
35

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

你在你的情况下这样使用它:

    class Meta:
        model = models.FavoriteList
        optional_fields = ['owner', ]
于 2016-10-24T20:19:18.260 回答
31

如果有人遇到类似问题,请注意以下属性required

允许空白

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

允许空

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

要求

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

我正在努力弄清楚为什么我required=False在错过allow_null属性的地方出现了验证错误。

于 2016-12-15T19:40:29.217 回答
15

在 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}}
于 2020-12-02T11:07:20.727 回答
2

如果您尝试设置的字段之一具有 unique_together 约束,则required=False需要validators=[]在序列化程序 Meta 中设置,例如

class FavoriteListSerializer(serializers.ModelSerializer):
    owner = serializers.IntegerField(required=False)
    class Meta:
        model = models.FavoriteList
        validators = []

这是原始答案

于 2020-02-01T11:13:06.137 回答
1

你也可以这样做:

class ASerializer(serializers.HyperlinkedModelSerializer): 
    owner = serializers.HiddenField(default=serializers.CurrentUserDefault())

    ...

如此处所述:https ://www.django-rest-framework.org/api-guide/validators/#advanced-field-defaults 当您还想让视图显示时,您还可以找到这种情况owner

于 2020-09-19T10:35:12.377 回答