Как фильтровать с помощью объекта django_filter, хранящегося в filter_class
Можно ли фильтровать с помощью объекта filter_class в методах класса ViewSet?
class ClassViewSet(mixins....., DefaultApiViewSet):
filter_class = ClassFilter
Что-то вроде:
filtered = self.filter_class.base_filters.get('something_severity').filter(queryset, "value")
Вы можете использовать queryset = self.filter_queryset(self.get_queryset())
в любом методе в вашем ViewSet. self.filter_queryset
использует класс filter_class за сценой.
Когда вы установили некоторые нужные вам фильтры в классе FilterSet(MultipleChoiceFilter,...)
class CarFilter(FilterSet):
wheel = MultipleChoiceFilter(choices=Wheel.CHOICES, method='wheel_filter', widget=CSVWidget)
def wheel_filter(self, queryset, name, cars):
if cars:
...
return queryset
class Meta:
model = Car
fields = []
Вам необходимо реализовать класс filter в ViewSet:
class DeviceViewSet(DefaultApiViewSet):
queryset = Car.objects.all()
serializer_class = CarSerializer
filter_class = CarFilter
Вы можете использоватьфильтр по своему усмотрению в методах ViewSet, если зададите его следующим образом:
ВАЖНО! - При использовании widget=CSVWidget
в MultipleChoiceFilter выше, это работает следующим образом:
def car_method(self, req):
queryset = self.filter_queryset(self.get_queryset())
self.filter_class({"wheel": "MEDIUM,LOW"}, queryset).qs
Когда мы НЕ используем widget=CSVWidget
, это работает следующим образом:
def car_method(self, req):
queryset = self.filter_queryset(self.get_queryset())
self.filter_class({'alert_severity': ['MEDIUM', 'LOW'], 'update_state': ['is_updated']}}, queryset).qs
Закончено! Мы отфильтровали автомобили на основе их колес.