Django ORM比较元组/字典顺序



作为Python Django中一些基于自定义游标的分页代码的一部分,我想在通用Queryset(其中我不知道表名称)上进行以下过滤和排序

WHERE (col_a, col_b) > (%s, %s)
ORDER BY col_a, col_b

如何用Django ORM来表达呢?

注意,我希望SQL保持元组比较,而不是基于AND子句。在之前的一些测试中,PostgreSQL似乎更有可能使用多列索引。

下面是一个在Django pre 3.2中工作的方法,使用annotate(不幸的是,它也需要设置一个output_field的小hack,即使不使用这个值)。

from django.db.models import F, Func, TextField
col_a_col_b = Func(F('col_a'), F('col_b'), function='ROW', output_type=TextField())
col_a_col_b_from = Func(col_a_value, col_b_value, function='ROW')
filtered_queryset = queryset 
.annotate(col_a_col_b=col_a_col_b) 
.filter(col_a_col_b__gt=col_a_col_b_from) 
.order_by('col_a', 'col_b')

在Django 3.2+中,你显然可以使用alias而不是annotate

这是有效的,因为所谓的元组实际上是行构造函数的简写,即(col_a, col_b)ROW(col_a, col_b)是一样的

以上是基于这张票中的信息

最新更新