python - 有没有办法确定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 以便其他查询对已经合并的查询进行,但是知道我的代码正在做相反的事情。有没有办法做到这一点?提前致谢。
解决方案
推荐阅读
- algorithm - 检查一个简单的无向图是否是三连接的
- c++ - 使用 boost 序列化多态类
- python - VSC 将为 Azure Functions 重新创建整个 Python 环境
- java - 如何在 Vaadin Flow 中使用自定义组合框过滤和 DataProvider?
- python - 关于 randint 和 if 的问题
- c++ - 什么是使用 opencv::Mat 优化 c++ 矩阵计算
- sass - 用户代理样式表位于何处,如何禁用它?
- ios - 使用 NSRunLoop 正确使用辅助 NSThread
- spring-data-jpa - Neo4jTransactionManager 不允许支持自定义隔离级别
- php - 控制器在 Symfony 中未显示 WSDL /w SoapServer