2014-11-30 10 views
8

Çok kaynağım var ve hepsine DjangoFilterBackend'i uygulamak istiyorum. Django Rest Framework'deki tüm kaynakların tüm alanlarına filtre arka planı nasıl uygulanır?

settings.py

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

ayarını çalıştı Ama ben sadece filter_backends = (filters.DjangoFilterBackend,) benim kaynaklardan biri ekleyerek çalıştı ve hala işe yaramadı

çalışmadı.

Sadece açık bir şekilde filter_fields = ('col1','col2',) ekledikten sonra yalnızca bu alanlarla çalışmaya başladı.

Filtre arka ucunu tüm kaynaklara ve tüm alanlara uygulayabilmemin bir yolu var mı (örneğin izinler ile aynı şekilde ...)?

Teşekkürler.

+0

Django filtre uygulamasını yüklediniz mi? – mariodev

+2

yep. Yazdığım gibi - açık bir şekilde filterbackend ve alanları ayarladığımda çalışıyor. – haki

cevap

10

Şu anda Django REST Framework'ün tüm görünümler için DjangoFilterBackend'u kullanacağını söylüyorsunuz, ancak FilterSet ürününün nasıl oluşturulacağını anlatmıyorsunuz.


django-filter otomatik fields are set to None eğer bir model üzerinde alanların tamamına ait bir FilterSet üretecektir. Django REST Framework, filter_fields are not set to None otomatik olarak FilterSet üretir; bu, varsayılan DjangoFilterBackend'u kullanamayacağınız anlamına gelir.

Modeldeki tüm alanlar için otomatik olarak FilterSet'u üretecek olan özel bir DjangoFilterBackend oluşturabilirsiniz.

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 

Bu hala görünümü özel bir filter_class veya filter_fields tanımlar durumlar için orijinal filtre panelini kullanabilirsiniz, ancak tüm diğer durumlar için özel bir FilterSet üretecektir. Kendinizi gelecekteki güvenlik sorunlarına (kullanıcı listesini şifre ile filtreleyen insanlar gibi) açarken, filtrelenecek API aracılığıyla iade edilmeyen alanlara izin vermemeniz gerektiğini unutmayın.

+0

Hey @Kevin Brows, Bu harika bir çözüm gibi gözüküyor ama yine de her kaynak için 'filter_backend' ayarlamamı gerektiriyor (ayarlardaki varsayılan arka ucu "app.filters.AllDjangoFilterBackend" olarak değiştirdim ve hala çalışmıyor. arka ucunu belirledikten sonra açıkça çalıştı ...) bunun yanında nasıl? – haki

+0

Ekrandaki filter_backend öğesini manuel olarak geçersiz kılarsanız, tekrarlamanız gerekir. Bunu yapabilirseniz, bunu –

+0

sınıfından kaldırabilirsiniz. Lütfen görünümde filter_backend'in nasıl geçersiz kılınacağını açıklayabilirsiniz. – amrit

İlgili konular