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)
延迟进入该线程。此问题已在django-rest-framework 2.3.13中修复。这是PR的链接。
在这种情况下,您可以这样使用它:
class Meta:
model = models.FavoriteList
optional_fields = ['owner', ]
Run Code Online (Sandbox Code Playgroud)
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)