class MyModelSerializer(serializers.ModelSerializer):
field1 = serializers.CharField()
field2 = serializers.SerializerMethodField('get_awesome_user')
def get_current_user(self):
request = self.context.get("request")
if request and hasattr(request, "user"):
return request.user
return None
def get_awesome_user(self, obj):
user = self.get_current_user()
## use this user object, do some stuff and return the value
return ...
मेरे एपीआई (जो authentication_classes
और permission_classes
उपयोग करता है) इस serializer उपयोग कर रहा है और get_current_user
समारोह हमेशा None
देता है। जब मैंने इसे डीबग किया, तो मैंने पाया कि self.context खाली शब्दकोश है, i.e {}
। डबल सुनिश्चित करने के लिए मैंने self.context.keys()
भी मुद्रित किया, फिर भी यह खाली सूची है।Django बाकी ढांचा - self.context अनुरोध विशेषता नहीं है
मैंने इस धागे का अनुसरण किया।
Get current user in Model Serializer
पुनश्च: मैं djangorestframework==3.3.3
उपयोग कर रहा हूँ, Django==1.9.1
संपादित करें: जोड़ने viewset कोड
class MyModelViewSet(viewsets.ModelViewSet):
authentication_classes = (SessionAuthentication, BasicAuthentication, TokenAuthentication)
permission_classes = (IsAuthenticated,)
def list(self, *args, **kwargs):
queryset = MyModel.objects.all()
page = self.paginate_queryset(queryset)
if page is not None:
serializer = MyModelSerializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = MyModelSerializer(queryset, many=True)
return Response(serializer.data)
आमतौर पर, self.context 'generics.py:GenericApiVie द्वारा भरा जाता है w.get_serializer_context() 'फ़ंक्शन, जिसे' generics.py:GenericApiView.get_serializer() 'कहा जाता है, जिसे बदले में' viewset.list()/detail()/create()/delete ()/update() '' mixins.py' में। क्या आप अपना व्यूसेट कोड प्रदान कर सकते हैं, क्योंकि यह समझने की आवश्यकता है कि आप क्या करने की कोशिश कर रहे हैं? –
@ बॉब: प्रश्न विवरण में जोड़ा गया कोड कोड, कृपया एक नज़र डालें। – Wendy
देरी के लिए खेद है। वेंडी, 'कुछ सामान' ज्यादा समझा नहीं है। आप अपने विचारसेट की 'सूची()' विधि में धारावाहिक कैसे बनाते हैं? आपको अपने धारावाहिक संदर्भ को स्वचालित रूप से भरने के लिए 'serializer = self.get_serializer (data = request.data)' कॉल करना चाहिए, लेकिन मुझे लगता है कि आप इसे मैन्युअल रूप से बना रहे हैं, जैसे 'serializer = MyModelSerializer (instance) '। आपको या तो 'get_serializer()' को कॉल करना चाहिए, या धारावाहिक कन्स्ट्रक्टर को अतिरिक्त संदर्भ तर्क पास करना चाहिए: 'serializer = MyModelSerializer (उदाहरण, संदर्भ = {'अनुरोध': अनुरोध, ...})'। –