2016-07-09 10 views
5
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) 
+0

आमतौर पर, self.context 'generics.py:GenericApiVie द्वारा भरा जाता है w.get_serializer_context() 'फ़ंक्शन, जिसे' generics.py:GenericApiView.get_serializer() 'कहा जाता है, जिसे बदले में' viewset.list()/detail()/create()/delete ()/update() '' mixins.py' में। क्या आप अपना व्यूसेट कोड प्रदान कर सकते हैं, क्योंकि यह समझने की आवश्यकता है कि आप क्या करने की कोशिश कर रहे हैं? –

+0

@ बॉब: प्रश्न विवरण में जोड़ा गया कोड कोड, कृपया एक नज़र डालें। – Wendy

+0

देरी के लिए खेद है। वेंडी, 'कुछ सामान' ज्यादा समझा नहीं है। आप अपने विचारसेट की 'सूची()' विधि में धारावाहिक कैसे बनाते हैं? आपको अपने धारावाहिक संदर्भ को स्वचालित रूप से भरने के लिए 'serializer = self.get_serializer (data = request.data)' कॉल करना चाहिए, लेकिन मुझे लगता है कि आप इसे मैन्युअल रूप से बना रहे हैं, जैसे 'serializer = MyModelSerializer (instance) '। आपको या तो 'get_serializer()' को कॉल करना चाहिए, या धारावाहिक कन्स्ट्रक्टर को अतिरिक्त संदर्भ तर्क पास करना चाहिए: 'serializer = MyModelSerializer (उदाहरण, संदर्भ = {'अनुरोध': अनुरोध, ...})'। –

उत्तर

11

आप अपने viewset के list() विधि में serializer कैसे बनाऊं? । आप अपने serializer संदर्भ स्वचालित रूप से के रूप में यह में default implementation of this method in DRF mixins किया जाता है भरा पाने के लिए

serializer = self.get_serializer(data=request.data) 

बुलाना चाहिए, लेकिन मैं इस तरह लगता है कि तुम सिर्फ इसे मैन्युअल रूप से बना रहे हैं है,:

serializer = MyModelSerializer(instance) 

तो , इसे ठीक करने के लिए आपको या तो get_serializer() बुलाना चाहिए, या serializer निर्माता करने के लिए अतिरिक्त संदर्भ तर्क पारित:

serializer = MyModelSerializer(instance, context={'request': request, ...}) 
+0

धन्यवाद! आपका सुझाव काम किया :) – Wendy

+0

@Wendy ग्रेट! सौभाग्य। –

संबंधित मुद्दे