Я использую тот же подход, но общий, используя миксин:
class FilterMixin(object):
def get_queryset_filters(self):
filters = {}
for item in self.allowed_filters:
if item in self.request.GET:
filters[self.allowed_filters[item]] = self.request.GET[item]
return filters
def get_queryset(self):
return super(FilterMixin, self).get_queryset()\
.filter(**self.get_queryset_filters())
class ImageListView(FilterMixin, ListView):
allowed_filters = {
'name': 'name',
'tag': 'tag__name',
}
# no need to override get_queryset
Это позволяет указать список принятых фильтров, и они не должны соответствовать фактическим .filter()
ключевым словам.,Затем вы можете расширить его, чтобы поддерживать более сложную фильтрацию (простой разделитель - запятая при использовании фильтра __in
или __range
)