2014-12-24 23 views
8

Ich versuche, die CurrentUserDefault Klasse für einen Serializer zu verwenden.Django REST Framework - CurrentUserDefault Verwendung

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

Die docs sagt:

Um dies zu nutzen, der ‚Antrag‘ muss als Teil der Kontext-Wörterbuch zur Verfügung gestellt wurde, wenn die Serializer instanziieren.

Ich bin mir nicht sicher, wie man den Serializer erstellt. Nach der Ansicht, ich die Serializer alle mit erstellen:

serializer = NewModelSerializer(data=request.data) 

Also habe ich versucht:

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

und

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

Und in beiden Fällen ist der Fehler gleich:

Auch ich habe versucht, die Unicode Tasten des Wörterbuchs (u'request') mit dem gleichen Glück.

Gibt es eine bessere Möglichkeit, den angemeldeten Benutzer an einen Serializer zu übergeben?

Ich verwende Django REST Framework 3.0 und Python 2.7.6

Antwort

11

Django REST-Framework übernimmt die Serialisierung und Deserialisierung von Objekten eines zentralen Serializer verwenden. Um das Deserialisieren und Serialisieren manchmal zu unterstützen, benötigt es ein wenig Kontext wie die aktuelle view oder request, die verwendet wird. In der Regel müssen Sie sich keine Gedanken darüber machen, da die generischen Ansichten diese automatisch für Sie übernehmen. Dies wird in der Dokumentation unter "Including extra context" behandelt und nutzt den optionalen Parameter context für Serialisierer.

Wenn Sie Serializer manuell verwenden, muss der Kontext als Wörterbuch übergeben werden. Einige Felder erfordern bestimmte Schlüssel, aber in den meisten Fällen benötigen Sie nur den Schlüssel request als Referenz für die eingehende Anforderung. Dies ermöglicht der HyperlinkedRelatedField, eine vollständige URL zu generieren, und Extras wie die CurrentUserDefault, um wie erwartet durchzuführen.

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

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

Der Kontext-Wörterbuch ist auch auf generischen Ansichten als get_serializer_context Methode, die das Wörterbuch automatisch mit häufig verwendeten Tasten wie die request und view bevölkern werden.

+4

Sie haben mein Weihnachten gerettet –

+1

Dies ist sehr hilfreich. Und leider ist der Fehler, den es wirft, wenn Sie den zusätzlichen Kontext nicht liefern, überhaupt nicht sehr hilfreich. Es löst eine KeyError-Ausnahme mit der Nachricht u'request aus. – Emeka

Verwandte Themen