2016-01-05 6 views
6

मैं अपने दृश्य.py और Serializers.py में अनुरोध ऑब्जेक्ट को DRF में एक्सेस करना चाहता हूं। मेरे Views.py:Django रेस्ट फ्रेमवर्क में व्यूसेट और सीरियललाइज़र में अनुरोध ऑब्जेक्ट एक्सेस करना?

class ProductViewSet(viewsets.ReadOnlyModelViewSet): 

    """ 
    This viewset automatically provides `list` and `detail` actions. 
    """ 
    queryset = Product.objects.all() 
    serializer_class = ProductSerializer(context={'request': request}) 

मेरे Serializers.py:

class ProductSerializer(serializers.HyperlinkedModelSerializer): 

    get_sr_price = serializers.SerializerMethodField('get_sr_price_func') 

    def get_sr_price_func(self, obj): 
     return self.request.user ?? 

    class Meta: 
     model = Product 
     fields = (
      'title', 'slug', 'product_stores', 'get_sr_price') 

Serializers.py में मैं ProductSerializer' object has no attribute 'request' मिलता है। इसके अलावा views में मुझे NameError: name 'request' is not defined

मैं अनुरोध ऑब्जेक्ट का उपयोग कैसे करूं? क्या मुझे इसे विचारों से धारावाहिकों तक पास करना है? Views.py और serializers.py के बीच क्या अंतर है? आम तौर पर मैं Views.py में सभी व्यावसायिक तर्क लिखता हूं; यहां मुझे विचारों में सभी प्रश्न/फ़िल्टर भी करना चाहिए या क्या मुझे उन्हें धारावाहिकों में करना चाहिए या इससे कोई फर्क नहीं पड़ता। डीआरएफ के लिए नया कृपया मदद करें।

+1

डीआरएफ संदर्भ में डिफ़ॉल्ट रूप से 'request' वस्तु भी शामिल है। 'Self.context [' request '] का उपयोग करें। उपयोगकर्ता'। –

+0

यह काम करता है। इसे एक उत्तर के रूप में जोड़ें स्वीकार करेंगे। – Coderaemon

उत्तर

15

आपको संदर्भ में request ऑब्जेक्ट को शामिल करने की आवश्यकता नहीं है क्योंकि सामान्य दृश्य request ऑब्जेक्ट को धारावाहिक संदर्भ में पास करते हैं।

डीआरएफ स्रोत कोड स्निपेट:

# rest_framework/generics.py 
def get_serializer_context(self): 
    """ 
    Extra context provided to the serializer class. 
    """ 
    return { 
     'request': self.request, # request object is passed here 
     'format': self.format_kwarg, 
     'view': self 
    } 

अपने serializer में, आप कर सकते हैं accessrequest वस्तु .context विशेषता का उपयोग।

The context dictionary can be used within any serializer field logic, such as a custom .to_representation() method, by accessing the self.context attribute.

class ProductSerializer(serializers.HyperlinkedModelSerializer): 

    get_sr_price = serializers.SerializerMethodField('get_sr_price_func') 

    def get_sr_price_func(self, obj): 
     return self.context['request'].user # access the request object 
1

सीरियलाइज़र बाहरी डेटा को मॉडल/मॉडल (डीजेगो या सरल पायथन कक्षाओं) से मैप किया जाता है।

विचार इस बात से निपट रहे हैं कि डेटा कैसे दिखाया जाएगा। थ्रॉटलिंग, पेजिनेशन, प्रमाणीकरण दृश्य द्वारा प्रबंधित किया जाता है। वे डेटा सेट को भी संभालते हैं।

डीआरएफ इनरिट को फिर से परिभाषित किए बिना सीरिएलाइज़र को अनुरोध विशिष्ट डेटा पास करने के लिए context प्रदान करता है। यह संभव है कि आप जो खोज रहे हैं।

+0

विचारों से संदर्भ पारित करने का प्रयास किया 'serializer_class = ProductSerializer (संदर्भ = {' अनुरोध ': अनुरोध})' यह कहता है 'नाम त्रुटि: नाम' अनुरोध 'परिभाषित नहीं किया गया है – Coderaemon

+1

serializer_class को एक वर्ग माना जाना चाहिए, उदाहरण नहीं। – Linovia

+0

आप ओवरराइड करना चाहिए देखने के 'get_serializer_context' – Linovia

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