作为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)
是一样的
以上是基于这张票中的信息