2014-11-30 6 views
8

मेरे पास बहुत सारे संसाधन हैं और मैं उन सभी को DjangoFilterBackend लागू करना चाहता हूं।Django Rest Framework में सभी संसाधनों के सभी क्षेत्रों में फ़िल्टर बैकएंड कैसे लागू करें?

की कोशिश की settings.py

'DEFAULT_FILTER_BACKENDS': [ 
      'rest_framework.filters.DjangoFilterBackend', 
     ] 

में स्थापित करने लेकिन यह काम नहीं किया

मैं केवल filter_backends = (filters.DjangoFilterBackend,) मेरी संसाधनों में से एक को जोड़ने की कोशिश की और यह अभी भी काम नहीं किया।

केवल स्पष्ट रूप से filter_fields = ('col1','col2',) को जोड़ने के बाद ही यह केवल उन फ़ील्ड के साथ काम करना शुरू कर दिया।

क्या कोई तरीका है कि मैं सभी संसाधनों और सभी क्षेत्रों में फ़िल्टर बैकएंड लागू कर सकता हूं (उसी तरह मैं उदाहरण के लिए अनुमतियों के साथ करता हूं ...)?

धन्यवाद।

+0

क्या आपने django-filter ऐप इंस्टॉल किया है? – mariodev

+2

हाँ। जैसा कि मैंने लिखा - यह काम कर रहा है जब मैं स्पष्ट रूप से फिल्टरबैक और फ़ील्ड सेट करता हूं। – haki

उत्तर

10

अभी आप सभी विचारों के लिए DjangoFilterBackend का उपयोग करने के लिए Django REST Framework को बता रहे हैं, लेकिन आप यह नहीं बता रहे हैं कि FilterSet उत्पन्न होना चाहिए।


django-filter स्वचालित रूप से एक मॉडल है, तो fields are set to None पर क्षेत्रों के सभी के लिए एक FilterSet उत्पन्न होगा। Django REST Framework स्वचालित रूप से FilterSet उत्पन्न करेगा यदि filter_fields are not set to None, जिसका अर्थ है कि आप डिफ़ॉल्ट DjangoFilterBackend का उपयोग करने में सक्षम नहीं होंगे।

हालांकि आप एक कस्टम DjangoFilterBackend बना सकते हैं, जो मॉडल पर सभी फ़ील्ड के लिए स्वचालित रूप से FilterSet उत्पन्न करेगा।

from rest_framework.filters import DjangoFilterBackend 

class AllDjangoFilterBackend(DjangoFilterBackend): 
    """ 
    A filter backend that uses django-filter. 
    """ 

    def get_filter_class(self, view, queryset=None): 
     """ 
     Return the django-filters `FilterSet` used to filter the queryset. 
     """ 
     filter_class = getattr(view, 'filter_class', None) 
     filter_fields = getattr(view, 'filter_fields', None) 

     if filter_class or filter_fields: 
      return super(AllDjangoFilterBackend, self).get_filter_class(self, view, queryset) 

     class AutoFilterSet(self.default_filter_set): 
      class Meta: 
       model = queryset.model 
       fields = None 

     return AutoFilterSet 

यह अभी भी स्थितियों में, जहां दृश्य एक कस्टम filter_class या filter_fields को परिभाषित करता है के लिए मूल फिल्टर बैकएंड का उपयोग करेगा, लेकिन यह अन्य सभी परिस्थितियों के लिए एक कस्टम FilterSet उत्पन्न होगा। ध्यान रखें कि आपको उन फ़ील्ड को अनुमति नहीं देनी चाहिए जिन्हें फ़िल्टर करने के लिए एपीआई के माध्यम से वापस नहीं किया जाता है, क्योंकि आप भविष्य में सुरक्षा मुद्दों (जैसे पासवर्ड द्वारा उपयोगकर्ता सूची फ़िल्टर करने वाले लोगों) को खोल रहे हैं।

+0

हे @ केविन ब्राउज, यह एक महान समाधान की तरह दिखता है लेकिन फिर भी मुझे प्रत्येक संसाधन के लिए 'filter_backend' सेट करने की आवश्यकता है (मैंने सेटिंग में डिफ़ॉल्ट बैकएंड को' app.filters.AllDjangoFilterBackend' में बदल दिया है और यह अभी भी काम नहीं कर रहा है। केवल बैकएंड को स्पष्ट रूप से स्थापित करने के बाद यह काम करता है ...) इसके आसपास किसी भी तरह से? – haki

+0

यदि आप दृश्य पर filter_backend मैन्युअल रूप से ओवरराइड करते हैं, तो आपको इसे फिर से दोहराना होगा। यदि आप कर सकते हैं, तो इसे –

+0

से हटा दें, क्या आप कृपया बता सकते हैं कि फ़िल्टर_बैकएंड को ओवरराइड कैसे करें ... – amrit