2014-12-24 17 views
8

का उपयोग करें मैं एक serializer के लिए CurrentUserDefault कक्षा का उपयोग करने का प्रयास कर रहा हूं।Django REST Framework - CurrentUserDefault

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

डॉक्स का कहना है:

आदेश में इस का उपयोग करने के लिए, 'अनुरोध' जब serializer instantiating संदर्भ शब्दकोश का हिस्सा के रूप में प्रदान किया गया होगा।

मुझे यकीन नहीं है कि धारावाहिक कैसे बनाएं।

serializer = NewModelSerializer(data=request.data) 

तो मैं का प्रयास किया है:: दृश्य पर मैं के साथ सभी serializers बनाने

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 बाकी फ्रेमवर्क 3.0 और अजगर 2.7.6

उत्तर

11

Django बाकी फ्रेमवर्क का उपयोग कर रहा क्रमबद्धता और एक केंद्रीय serializer का उपयोग कर वस्तुओं की अक्रमांकन संभालती है। कभी-कभी deserialize और serialize मदद करने के लिए, इसे वर्तमान view या request जैसे कुछ संदर्भ की आवश्यकता है जिसका उपयोग किया जा रहा है। आपको आमतौर पर इसके बारे में चिंता करने की ज़रूरत नहीं है क्योंकि सामान्य विचार आपके लिए स्वचालित रूप से इसे संभालते हैं। यह "Including extra context" के तहत प्रलेखन में शामिल है और यह serializers के लिए वैकल्पिक context पैरामीटर का लाभ उठाता है।

जब आप मैन्युअल रूप से धारावाहिक का उपयोग कर रहे हैं, तो संदर्भ को एक शब्दकोश के रूप में पारित किया जाना चाहिए। कुछ फ़ील्ड को विशिष्ट कुंजी की आवश्यकता होती है, लेकिन अधिकांश भाग के लिए आपको इनकमिंग अनुरोध का संदर्भ होने के लिए केवल request कुंजी की आवश्यकता होती है। यह एक पूर्ण यूआरएल उत्पन्न करने के लिए HyperlinkedRelatedField की अनुमति देगा, और उम्मीद के अनुसार प्रदर्शन करने के लिए CurrentUserDefault जैसे अतिरिक्त।

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

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

संदर्भ शब्दकोश भी get_serializer_context विधि है, जो स्वचालित रूप से इस तरह के request और view के रूप में आमतौर पर इस्तेमाल किया कुंजी के साथ शब्दकोश से स्थापित हो जाएगा के रूप में सामान्य विचारों पर उपलब्ध है।

+4

आपने सर ने मेरे क्रिसमस –

+1

को बचाया यह बहुत उपयोगी है। और दुर्भाग्यवश अगर आप अतिरिक्त संदर्भ की आपूर्ति नहीं करते हैं तो यह त्रुटि बहुत उपयोगी नहीं है। यह यूरेक्वेस्ट संदेश के साथ एक KeyError अपवाद फेंकता है। – Emeka