使用django-rest-framework如何在使用ModelViewSet时为请求用户分配字段?

时间:2014-10-08 17:42:30

标签: django django-rest-framework

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中指定的模型和字段列表。

4 个答案:

答案 0 :(得分:1)

在我的模特中,我覆盖了clean_fieldsclean_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()

获得一个