2014-12-24 141 views
8

我試圖使用CurrentUserDefault類爲一個序列化程序。Django REST框架 - 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框架3.0和Python 2.7.6

回答

11

Django的REST框架處理使用中央串行對象的序列化和反序列化。爲了有助於反序列化和序列化,它需要一些上下文,如當前正在使用的viewrequest。您通常不必擔心它,因爲通用視圖會自動爲您處理它。這包括在"Including extra context"下的文檔中,它利用串行器的可選context參數。

當您手動使用序列器時,上下文必須作爲字典傳入。某些字段需要特定的密鑰,但大多數情況下,只需要將request密鑰作爲對傳入請求的引用。這將允許HyperlinkedRelatedField生成一個完整的URL,並像CurrentUserDefault一樣按照預期執行。

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

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

上下文字典也可在作爲get_serializer_context方法,該方法將自動填充與常用鍵,如requestview字典通用視圖。

+4

你先生救了我的聖誕節 –

+1

這是非常有幫助的。不幸的是,如果你不提供額外的上下文,它會拋出的錯誤並不是非常有用。它拋出一個KeyError異常與消息u'request'。 – Emeka