Django REST框架 - 使用CurrentUserDefault

alf*_*kim 9 python django django-rest-framework

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

user = serializers.HiddenField(default=serializers.CurrentUserDefault())
Run Code Online (Sandbox Code Playgroud)

文档说:

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

我不知道如何创建序列化程序.在视图中,我创建了所有序列化程序:

serializer = NewModelSerializer(data=request.data)
Run Code Online (Sandbox Code Playgroud)

所以我尝试过:

context = dict(request.data)
context['request'] = request
serializer = NewModelSerializer(data=context)
Run Code Online (Sandbox Code Playgroud)

context['request'] = {'user': request.user}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我还试着u'request'用同样的运气来解码字典()的键.

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

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

Kev*_*own 17

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

手动使用序列化程序时,必须将上下文作为字典传入.某些字段需要特定的密钥,但在大多数情况下,您只需要request密钥作为对传入请求的引用.这将允许HyperlinkedRelatedField生成一个完整的URL,以及像CurrentUserDefault预期的那样执行的附加功能.

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

serializer = NewModelSerializer(data=request.data, context=context)
Run Code Online (Sandbox Code Playgroud)

上下文字典在通用视图上也可用作get_serializer_context方法,它将使用常用键(例如request和)自动填充字典view.

  • 先生,我救了我的圣诞节 (6认同)
  • 这非常有帮助。不幸的是,如果您不提供额外的上下文,它抛出的错误根本没有多大帮助。它抛出一个 KeyError 异常,并显示消息 u'request'。 (2认同)