W tej chwili mówisz Django REST Framework, aby używał DjangoFilterBackend
dla wszystkich widoków, ale nie mówisz, jak powinno być wygenerowane FilterSet
.
django-filter
automatycznie wygeneruje FilterSet
dla wszystkich pól na model z fields
are set to None
. Django REST Framework automatycznie wygeneruje FilterSet
, jeśli filter_fields
are not set to None
, co oznacza, że nie będzie można użyć domyślnego DjangoFilterBackend
.
Można jednak utworzyć niestandardową DjangoFilterBackend
, która automatycznie wygeneruje FilterSet
dla wszystkich pól w modelu.
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
ten będzie nadal korzystać z oryginalnego backend filtra dla sytuacji, w których widok definiuje zwyczaj filter_class
lub filter_fields
, ale będzie generować niestandardową FilterSet
dla wszystkich innych sytuacjach. Pamiętaj, że nie należy zezwalać na filtrowanie pól, które nie są zwracane przez interfejs API, ponieważ otwierasz się na przyszłe problemy z bezpieczeństwem (np. Przez filtrowanie listy użytkowników za pomocą haseł).
Czy zainstalowałeś aplikację Django-Filter? – mariodev
tak. Tak jak napisałem - działa, gdy jawnie ustawiam filterbackend i pola. – haki