Я использую фильтры Django вместе с Django Rest Framework для создания фильтров для представлений API. У них хороший синтаксис, который я показываю в фильтре поля age
ниже, определенном в метаклассе fields = {'age': ['exact', 'gte', 'lte', 'lt', 'gt', 'in']}
, который позволяет создавать все эти фильтры больше или равно, меньше или равно, меньше, больше и т. д. для поля все однажды...
Однако с настраиваемым полем, таким как artworks_count
, которое я также показываю ниже, кажется, что мне нужно добавить разные методы для каждого выражения поиска, что довольно повторяется. Мне просто интересно, нет ли лучшего способа сделать это? (возможно, с использованием чего-то другого, кроме NumberFilter
?), который будет принимать lookup_expression
в качестве аргумента и позволит мне создать единственный метод, используя его
class UserFilter(django_rest_filters.FilterSet):
artworks_count__gte = django_rest_filters.NumberFilter(method="filter_artworks_count__gte")
class Meta:
model = User
fields = {'age': ['exact', 'gte', 'lte', 'lt', 'gt', 'in']}
def filter_artwork_count__gte(self, qs, name, value):
return qs.annotate(art_count=Count('artworks')).filter(art_count__gte=value)