Аннотирование полей в 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 
Вернуться на верх