2014-12-24 3 views
8

Я пытаюсь использовать класс CurrentUserDefault для одного сериализатора.Django REST Framework - использование 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 

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

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

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

ответ

11

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

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

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

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

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

+4

Вы сэр сохранили мое Рождество –

+1

Это очень полезно. И, к сожалению, ошибка, которую она бросает, если вы не предоставляете дополнительный контекст, совсем не очень помогает. Он выдает исключение KeyError с сообщением u'request '. – Emeka

Смежные вопросы