django-filter
хочет и предполагает, что вы используете наборы запросов.Как только вы берете набор запросов и изменяете его на list
, то все, что находится в нисходящем направлении, должно иметь возможность обрабатывать только list
или просто выполнять итерацию по списку, который больше не является набором запросов.
Еслиу вас есть django_filters.FilterSet
like:
class FooFilterset(django_filters.FilterSet):
bar = django_filters.Filter('updated', lookup_expr='exact')
my_property_filter = MyPropertyFilter('property')
class Meta:
model = Foo
fields = ('bar', 'my_property_filter')
, тогда вы можете написать MyPropertyFilter
like:
class MyPropertyFilter(django_filters.Filter):
def filter(self, qs, value):
return [row for row in qs if row.baz == value]
На этом этапе все, что ниже MyProperteyFilter
будет иметь список.
Примечание. Я полагаю, что порядок fields
должен иметь ваш собственный фильтр, MyPropertyFilter
последний, потому что тогда он всегда будет обрабатываться после обычных фильтров набора запросов.
Итак, вы только что нарушили API "queryset", для определенных значений не работает.На этом этапе вам придется работать с ошибками всего, что находится ниже по течению.Если что-то после FilterSet
требует .count
участника, вы можете изменить MyPropertyFilter
, например:
class MyPropertyFilter(django_filters.Filter):
def filter(self, qs, value):
result = [row for row in qs if row.baz == value]
result.count = len(result)
return result
Вы находитесь на неизведанной территории, и вам придется взломать свой путь.
В любом случае, я делал это раньше, и это не ужасно.Просто примите ошибки по мере их поступления.