首页 > 解决方案 > 有没有办法确定FilterSet(来自django-filter)执行查询的顺序?

问题描述

我在一个项目中使用 django-filter。我必须为过滤器声明方法才能合并正在做的查询。但是,除了进行这些合并之外,我还需要应用其他过滤器。我的问题是似乎无法确定过滤器执行查询的顺序。这是我的代码

class Tramite(models.Model):
    ....

class FechasEtapas(models.Model):  
    tramite = models.ForeignKey(Tramite, on_delete=models.CASCADE, related_name='etapas')
    etapa = models.IntegerField(choices=ETAPA_CHOICES, default=1)

观点:

class TramiteFilter(filters.FilterSet):
    origen__contains = BaseCSVFilter(method='filter_origen')
    origen__not_contains = BaseCSVFilter(method='filter_not_origen')
    lead__fecha_creacion = DateFromToRangeFilter()
    fecha_etapa_1__after = CharFilter(method='filter_etapa_fecha_greater')
    fecha_etapa_2__after = CharFilter(method='filter_etapa_fecha_greater')
    fecha_etapa_3__after = CharFilter(method='filter_etapa_fecha_greater')
    ....

    def __init__(self, *args, **kwargs):
        self.len_tramite = Tramite.objects.all().count()
        super().__init__(*args, **kwargs)


    class Meta:
        model = Tramite
        fields = {
            'lead__score': ['lte', 'gte'],
            ....

        }

    def filter_origen(self, qs, name, value):
        return qs.filter(reduce(operator.or_, (Q(origen__contains=x) for x in value)))

    def filter_not_origen(self, qs, name, value):
        return qs.exclude(reduce(operator.or_, (Q(origen__contains=x) for x in value)))

    def filter_etapa_fecha_greater(self, qs, name, value):
        if len(qs) != self.len_tramite:
            return (qs | Tramite.objects.filter(etapas__etapa=name[12], etapas__fecha_etapa__gte=value).distinct()).distinct()
        return qs.filter(etapas__etapa=name[12], etapas__fecha_etapa__gte=value)

我需要首先运行过滤器 fecha_etapa_x__after 以便其他查询对已经合并的查询进行,但是知道我的代码正在做相反的事情。有没有办法做到这一点?提前致谢。

标签: pythondjangodjango-filter

解决方案


推荐阅读