Django REST框架 - 使用CurrentUserDefault

时间:2014-12-24 06:15:55

标签: python django django-rest-framework

我正在尝试将CurrentUserDefault类用于一个序列化程序。

user = serializers.HiddenField(default=serializers.CurrentUserDefault())

文档说:

  

为了使用它,'request'必须作为一部分提供   实例化序列化程序时的上下文字典。

我不确定如何创建序列化程序。在视图中,我使用以下命令创建所有序列化程序:

serializer = NewModelSerializer(data=request.data)

所以我尝试过:

context = dict(request.data)
context['request'] = request
serializer = NewModelSerializer(data=context)

context['request'] = {'user': request.user}

在这两种情况下,错误都是一样的:

Exception Type:     KeyError
Exception Value:    'request'
on:
/Users/Alfonso/virtualenvs/sports/lib/python2.7/site-packages/rest_framework/fields.py in set_context

        self.user = serializer_field.context['request'].user

此外,我试图以相同的运气对字典(u'request')的键进行解码。

有没有更好的方法将记录的用户传递给序列化程序?

我正在使用Django REST Framework 3.0和Python 2.7.6

1 个答案:

答案 0 :(得分:16)

Django REST Framework使用中央串行器处理对象的序列化和反序列化。为了有时帮助反序列化和序列化,它需要一些上下文,例如正在使用的当前viewrequest。您通常不必担心它,因为通用视图会自动为您处理。这在"Including extra context"下的文档中有所介绍,它利用序列化程序的可选context参数。

手动使用序列化程序时,必须将上下文作为字典传入。某些字段需要特定密钥,但在大多数情况下,您只需要request密钥作为对传入请求的引用。这将允许HyperlinkedRelatedField生成完整的网址,以及CurrentUserDefault之类的额外内容,以便按预期执行。

context = {
    "request": self.request,
}

serializer = NewModelSerializer(data=request.data, context=context)

通用视图上也可以使用上下文字典作为get_serializer_context方法,该方法将使用常用密钥(例如requestview自动填充字典。