Я использую django-фильтры 1.1.0. Мне нужно написать фильтр, который использует пользовательский запрос, но в котором он может дополнительно принимать суффикс __in
.
Это мое решение, но я не могу не надеяться, что есть немного более чистый способ сделать это подобно тому, как указано id
- возможно, используя единственный метод для бара и 'exact'
или '__in'
передается в качестве поискового аргумента.
class FooFilter(filters.FilterSet):
bar_id = filters.CharFilter(method='filter_bar_id', label='Bar')
bar_id__in = filters.CharFilter(method='filter_bar_id__in', label='Bar In')
def filter_bar_id(self, queryset, name, value):
return queryset.filter(
Q(abc__xyz__bar=value) |
Q(def__xyz__bar=value)).distinct()
def filter_bar_id__in(self, queryset, name, value):
bars = value.split(',')
return queryset.filter(
Q(abc__xyz__bar__in=bars) |
Q(def__xyz__bar__in=bars)).distinct()
class Meta:
model = Foo
fields = {
'id': ['exact', 'in'],
'bar_id': ['exact'],
'bar_id__in': ['exact'],
}
Есть ли у django-фильтров способ сделать это более естественным образом? Или это в значительной степени способ сделать это?
Есть еще один вопрос о стеке потока, который использует bar_id=
, чтобы разрешить как ?bar_id=1
, так и ?bar_id=1,2,3,4
. Ради согласованности с остальными моими django-фильтрами (такими как ?id
и ?id__in
, я не заинтересован в этом.