Cha*_*ays 3 python sorting django django-1.10
我需要根据布尔字段对查询集的两个部分进行不同的排序。- 具有 bool_val == True 的行应首先出现,并按 date_a 升序排序。- 具有 bool_val == False 的行应该排在第二位,并按 date_b 降序排序。
我得到的最接近的是
MyModel.objects.all().annotate(
sort_order=Case(
When(bool_val=True, then=('date_a')),
default='date_b')
).order_by('-bool_val', 'sort_order')
Run Code Online (Sandbox Code Playgroud)
但这会以相同的顺序对它们进行排序。如果我需要排序的值是数字,那么我会在我的注释中将一组乘以 -1,但它们是日期值,所以这是行不通的。
我还研究过创建两个单独的查询集并将它们组合起来,但 union() 直到 1.11 才可用,我必须支持 1.10,以及我发现的其他组合查询集的方法,要么不保留顺序,要么不支持'不会导致查询集(或两者)。(我不清楚 union() 是否保留顺序,但它没有实际意义,所以我也没有深入研究它。)最后这必须是一个 django QuerySet 对象。
这就是最终的工作:
MyModel.objects.annotate(
sort_order_true=Case(
When(bool_val=True, then=('date_a')),
default=None
),
sort_order_false=Case(
When(bool_val=False, then=('date_b')),
default=None
)
).order_by(
'sort_order_true',
'-sort_order_false',
)
Run Code Online (Sandbox Code Playgroud)