2014-12-24 4 views
8

Próbuję użyć klasy CurrentUserDefault dla jednego serializera.Django REST Framework - CurrentUserDefault use

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

docs mówi:

W celu wykorzystania tego, „żądanie” muszą być dostarczone jako część słownika kontekstu podczas uruchamianiu tego serializatora.

Nie wiem, jak utworzyć serializer. W widoku tworzę wszystkie serializers z:

serializer = NewModelSerializer(data=request.data) 

Więc spróbowaliśmy:

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

i

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

I w obu przypadkach błąd jest taki sam:

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 

Próbowałem również unicode the klucze słownika (u'request') z tym samym szczęściem.

Czy istnieje lepszy sposób przekazania zalogowanego użytkownika do serializera?

używam REST Django Framework 3.0 i Python 2.7.6

Odpowiedz

11

Django Framework REST obsługuje serializacji i deserializacji obiektów wykorzystujących centralną serializatora. Aby pomóc w deserializacji i serializacji czasami, potrzebuje trochę kontekstu, takiego jak aktualnie używany view lub request. Zazwyczaj nie musisz się tym martwić, ponieważ widoki ogólne obsługują je automatycznie. Jest to opisane w dokumentacji pod numerem "Including extra context" i korzysta z opcjonalnego parametru context dla serializerów.

Podczas ręcznego korzystania z serializatorów kontekst należy przekazać jako słownik. Niektóre pola wymagają określonych kluczy, ale w większości przypadków potrzebny jest tylko klucz request, który stanowi odniesienie do przychodzącego żądania. Dzięki temu HyperlinkedRelatedField wygeneruje pełny adres URL, a dodatki, takie jak CurrentUserDefault, będą działać zgodnie z oczekiwaniami.

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

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

Słownik kontekst jest również dostępna na ogólnych poglądów jak metoda get_serializer_context, który będzie automatycznie wypełnić słownik z powszechnie używanych klawiszy takich jak request i view.

+4

Ty uratowałeś moje święta –

+1

Jest to bardzo pomocne. I niestety błąd, który rzuca, jeśli nie dostarczasz dodatkowego kontekstu, nie jest bardzo pomocny. Zgłasza wyjątek KeyError z komunikatem u'request ". – Emeka