2014-04-16 11 views
6

में फ़िल्टर करने के लिए मेटाडेटा जोड़ना मेरे पास एक सामान्य ListCreateAPIView व्यू है। मैंने एक get_queryset फ़ंक्शन लागू किया है जो एक खोज करता है। फ़ंक्शन क्वेरी को पार करता है, टैग और शर्तों को निकालता है और एक क्वेरी सेट देता है।django आराम फ्रेमवर्क

def get_queryset(self): 
     query = self.request.QUERY_PARAMS.get('query', None) 

     # No deleted items 
     queryset = Items.objects.filter(deleted__isnull=True) 

     if query is None: 
      return queryset 

     predicates = [] 

     # Generate predicates from query  

     queryset = queryset.filter(reduce(__and__,predicates)) 
     return queryset 

सबसे अच्छा तरीका है get_queryset समारोह से डेटा के साथ जवाबी कार्रवाई के लिए मेटाडाटा को जोड़ने के लिए क्या है?

मैं पेजिनेशन काम के तरीके के समान कुछ ढूंढ रहा हूं।

{ 
query : { 
    terms : ['term1','term2'], 
    tags : ['tag1','tag2'] , 
    } 
results : [ 
     { name : 'item1', .... } 
     { name : 'item2', .... } 
    ] 
} 

संपादित

तो मैं छानने के लिए एक कस्टम FilterBackend बनाया है और अब मैं अनुरोध और प्रतिक्रिया का एक उदाहरण है। Django आराम के लिए पेजिनेशन कोड को देखते हुए मुझे लगता है कि यह परिणाम serializer में लपेट रहा है। पेजिनेशन व्यू क्लास में बनाया गया है, इसलिए अगर एक पेजिनेटर का पता चला है तो एफडब्ल्यू सीरियलाइजेशन को आमंत्रित करता है। खोज एपीआई को देखकर कोई नया विचार नहीं आया।

मेरा प्रश्न बनी हुई है, फिल्टर बैकएंड से मेटाडेटा को प्रतिक्रिया में जोड़ने का सबसे अच्छा और कम से कम घुसपैठ करने वाला तरीका क्या है?

एक तरीका मैं सोच सकता हूं (और जिसे मैं पसंद नहीं करता) फ़िल्टर बैकएंड में अनुरोध पर मैटाडाटा को अधिभारित करना है और दृश्य में finalize_response ओवरराइड करना है - इसमें कोई संदेह नहीं है कि इसे करने का सबसे बुरा तरीका है।

उत्तर

4

मुझे यकीन नहीं है कि यह सबसे अच्छा तरीका है, लेकिन मैं शायद प्रतिक्रिया ऑब्जेक्ट को अवरुद्ध करने के लिए get ओवरराइड करूँगा और प्रतिक्रिया.data को संशोधित करता हूं, हालांकि आप चाहें। कुछ आप पाया अपने आप को एक से अधिक सूची दृश्य के लिए यह दोहरा आप अपनी सूची में एपीआई वर्गों में अपने आप को एक Mixin का उपयोग कर सूखा रखने और यह शामिल हो सकते हैं, तो के रूप में

from rest_framework import generics 

class SomeModelList(generics.ListCreateAPIView): 
    """ 
    API endpoint representing a list of some things. 
    """ 

    model = SomeModel 
    serializer_class = SomeModelSerializer 

    def get(self, request, *args, **kwargs): 
     response = super(SomeModelList, self).get(request, *args, **kwargs) 

     # redefine response.data to include original query params 
     response.data = { 
      'query': dict(request.QUERY_PARAMS), 
      'results': response.data 
     } 

     return response 

के रूप में सरल:

from rest_framework import generics 
from rest_framework.mixins import ListModelMixin 

class IncludeQueryListMixin(ListModelMixin): 
    def list(self, request, *args, **kwargs): 
     response = super(IncludeQueryListMixin, self).list(request, *args, **kwargs) 

     # redefine response.data to include original query params 
     response.data = { 
      'query': dict(request.QUERY_PARAMS), 
      'results': response.data 
     } 

     return response 


class SomeModelList(IncludeQueryListMixin, generics.ListCreateAPIView): 
    """ 
    API endpoint representing a list of some things. 
    """ 

    model = SomeModel 
    serializer_class = SomeModelSerializer 
+0

जब मैं अवरोधन करने की कोशिश की प्रतिक्रिया ऑब्जेक्ट मुझे "ContentNotRenderedError - प्राप्त सामग्री को एक्सेस करने से पहले प्रस्तुत किया जाना चाहिए।" दुर्भाग्यवश, मुझे लगता है कि आपको उन स्थानों को ओवरराइट करने की आवश्यकता है जहां प्रतिक्रिया कहा जाता है ताकि आप "डेटा" के प्रारूप को बदल सकें। –

+0

@MarkChackerian मुझे यकीन नहीं है कि आपकी त्रुटि किस वजह से हुई है, लेकिन मैंने अपना उत्तर पूर्ण उदाहरण के साथ अपडेट किया है जिसे मैंने डीआरएफ 2.3.13 का उपयोग करके काम करने के लिए सत्यापित किया है। क्या आप फिर से जांच सकते हैं? – Fiver

+0

मैंने फिर से जांच की है और पुष्टि की है कि आपका समाधान काम करता है। जब भी मैं प्रतिक्रिया ऑब्जेक्ट का निरीक्षण करने का प्रयास करता हूं तब भी मुझे त्रुटि मिलती है, लेकिन वास्तव में ऐसा करने की आवश्यकता नहीं होती है। –

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