documentation建议APIViews:
def pre_save(self, obj):
obj.owner = self.request.user
这似乎不起作用,因为我回来了:
{
"owner": [
"This field cannot be null."
]
}
编辑:永远不会调用pre_save方法。通过在pdb
方法中插入pre_save
来调查。
我的序列化程序是一个简单的HyperlinkedModelSerializer,其中包含Meta中指定的模型和字段列表。
答案 0 :(得分:1)
在我的模特中,我覆盖了clean_fields
。 clean_fields
的签名:
Model.clean_fields(exclude=None)
我的自定义clean_fields
:
def clean_fields(self, exclude=None):
super(Applicant, self).clean_fields() # Bug here.
# custom clean_fields code
我没有将exclude
参数传递给超类!
天啊,这花了我这么多时间来调试。
答案 1 :(得分:1)
检查DRF 3.0 release notes个文档。他们有一个示例,在ViewSet中使用perform_create()
完全满足您的需要。
答案 2 :(得分:0)
包括"所有者"序列化程序Meta.exclude
中的字段(如果您使用"肯定"列表,则只需将其从字段列表中删除。)
class FooSerializer(serializers.Serializer):
class Meta(object):
model: Foo
exclude: ('owner',)
这样您就不会触发此字段的验证。此外,请确保端点使用强制身份验证进行修饰,或检查self.request.user.is_authenticated()
是否为True
。
答案 3 :(得分:0)
问题似乎是验证失败,因为“owner”字段是必需的,但未在初始数据中给出值(它在验证后获得值)。因为serializer.is_valid()在pre_save()之前运行,所以它失败了。
为什么版本更改修复它我不知道。我自己已经将所有者设置为必需= False,尽管对象总是从pre_save()
获得一个