我需要根据布尔字段对查询集的两个部分进行不同的排序。 - 具有bool_val == True的行应先到达,并按date_a排序,按升序排序。 - 具有bool_val == False的行应该排在第二位,并按date_b降序排序。如何在django中包含有条件的order_by?
我已经得到的最接近的是
MyModel.objects.all().annotate(
sort_order=Case(
When(bool_val=True, then=('date_a')),
default='date_b')
).order_by('-bool_val', 'sort_order')
但是,排序他们都以相同的顺序。如果我需要排序的值是数字,那么我将在我的注释中乘以-1来设置一个值,但它们是日期值,因此不起作用。我还研究过创建两个单独的查询集合并它们,但union()不可用,直到1.11,我必须支持1.10,并且我已经找到的其他组合查询集合的方法不要维护订单或不导致查询集(或两者)。 (我并不清楚union()是否保留了顺序,但它没有实际意义,所以我也没有深入研究它。)这必须是最后一个django QuerySet对象。
您可以使用日期负号:'.order_by(“bool_val”,“-sort_order”)' –
是的,但你不能有条件地做到这一点。 –