In questo momento stai dicendo a Django REST Framework di utilizzare DjangoFilterBackend
per tutte le visualizzazioni, ma non stai dicendo come dovrebbe essere generato il FilterSet
.
django-filter
genererà automaticamente un FilterSet
per tutti i campi su un modello se il fields
are set to None
. Django REST Framework genererà automaticamente unse filter_fields
are not set to None
, il che significa che non sarà possibile utilizzare il valore predefinito DjangoFilterBackend
.
È tuttavia possibile creare un numero personalizzato DjangoFilterBackend
, che genererà automaticamente lo FilterSet
per tutti i campi sul modello.
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
Questa utilizzerà ancora il back-end filtro originale per situazioni in cui la vista definisce un costume filter_class
o filter_fields
, ma genera un personalizzato FilterSet
per tutte le altre situazioni. Tieni presente che non devi consentire che i campi che non vengono restituiti tramite l'API vengano filtrati, in quanto ti stai aprendo a futuri problemi di sicurezza (come ad esempio le persone che filtrano un elenco utenti tramite password).
fonte
2014-11-30 23:25:08
Hai installato l'applicazione django-filter? – mariodev
sì. Come ho scritto - Funziona quando imposto filtribackback e campi in modo esplicito. – haki