Аннотирование полей в django_filter
Я использую django_filters для поиска по большому запросу с аннотациями:
https://django-filter.readthedocs.io/en/stable/
Мой вопрос в том, существует ли какой-то способ фильтрации по полям Annotate? Например, по whateverannotate?
whateverquery=Whatever.objects.filter(query).values('whatever').annotate(
total=Count('id'),
whateverannotate=Count(Case(When(whatever_field="whateveValue", then=1),output_field=IntegerField()))).values('whateverannotate','total').order_by(order)
response_form=WhateverFilter(request.GET, queryset=whateverquery)
filtered_qs = response_form.qs
Filter
class SupplierFilter(django_filters.FilterSet):
Choices_options =(
('',''),
('Si','Si'),
('No','No'),
('Todos','Todos'))
whateverannotate = django_filters.ChoiceFilter(label="whateverannotate",choices=Choices_options,method='whateverannotate_order')
class Meta:
model = Supplier
fields = {
'whateverannotate': ['lt', 'gt','exact'],
}
def everannotate_order(self,queryset,name,value):
return queryset
Я решаю это сам.
Это правильный синтаксис, если вы хотите упорядочить с помощью django_filters поле, созданное аннотацией или агрегатом в одном запросе в Django.
class WhateverFilter(django_filters.FilterSet):
Choices =(
('',''),
('mayor_a_menor','mayor_a_menor'),
('menor_a_mayor','menor_a_mayor'))
order_field_an = django_filters.ChoiceFilter(label="order_field",choices=Choices,method='order_field_method')
class Meta:
model = ModelWhatever
fields = []
def order_field_method(self,queryset,name,value):
if value=='mayor_a_menor':
filter_order='-field'
return queryset.order_by(filter_order)
elif value=="menor_a_mayor":
filter_order='field'
return queryset.order_by(filter_order)
else:
return queryset