Как фильтровать с помощью объекта 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

Закончено! Мы отфильтровали автомобили на основе их колес.

Вернуться на верх