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
.