Django Rest Framework - использование CurrentUserDefault

Я пытаюсь использовать CurrentUserDefault класс для одного сериализатора.

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

документы говорит:

чтобы использовать это, "запрос" должен быть предоставлен как часть контекстный словарь при создании экземпляра сериализатора.

Я не уверен, как создать сериализатор. В представлении я создаю все сериализаторы с помощью:

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

также я попытался unicode ключи словаря (u'request') С такой же удачей.

есть ли лучший способ передать зарегистрированного пользователя сериализатору?

Я использую Django Rest Framework 3.0 и Python 2.7.6

1 ответов


Django Rest Framework обрабатывает сериализацию и десериализацию объектов с помощью центрального сериализатора. Чтобы помочь десериализовать и сериализовать иногда, ему нужно немного контекста, такого как current view или request что используется. Обычно вам не нужно беспокоиться об этом, потому что общие представления обрабатывают его автоматически для вас. Это описано в документации в разделе "включая дополнительный контекст" и он использует дополнительно context параметр для сериализаторов.

при использовании сериализаторов вручную контекст должен быть передан как словарь. Некоторые поля требуют определенных ключей, но по большей части вам нужно только request ключ для ссылки на входящий запрос. Это позволит HyperlinkedRelatedField для создания полного URL-адреса и дополнительных функций, таких как CurrentUserDefault выполнить, как ожидалось.

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

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

контекстный словарь также доступен в общих представлениях как get_serializer_context метод, который будет автоматическое заполнение словаря часто используемыми ключами, такими как request и view.