我正在嘗試以特定方式訂購查詢集,但不知道該怎么做。首先,我希望它按降序排序end_date- 首先將任何空end_date記錄分組。然后列表應(yīng)該按primary字段排序,然后是降序amount。queryset = MyModel.exclude_denied.filter(user=user).order_by( "end_date", "primary", "-amount" )這是我目前擁有的,但它并沒有像我想要的那樣返回它。我希望這些組看起來像這樣:沒有的項(xiàng)目end_dateprimary首先列出的項(xiàng)目,然后按 desc 排序amount項(xiàng)目與end_dateprimary首先列出的項(xiàng)目,然后按 desc 排序amount我正在嘗試實(shí)現(xiàn)這樣的查詢集:ItemA - end_date:None - primary:TrueItemB - end_date:None - primary:FalseItemC - end_date:None - primary:FalseItemD - end_date:08/10/2018 - primary:TrueItemE - end_date:07/10/2019 - Primary:FalseItemF - end_date:06/08/2018 - Primary:FalseItemG - end_date:04/16/2017 - Primary:False是否嘗試僅使用order_by適當(dāng)?shù)姆椒▌?chuàng)建此訂單?我覺得它很近 - 但不完全在那里。我認(rèn)為更好的方法是創(chuàng)建 2 個(gè)查詢集,然后將它們合并在一起以保持它們的順序。像這樣的東西:Queryset1 = 沒有的項(xiàng)目end_date,降序primary,然后降序amountQueryset2 = 具有end_date(desc)、降序primary、降序的項(xiàng)目amount合并兩個(gè) Queryset,但首先按順序列出 Queryset1 項(xiàng),然后列出 Queryset2 項(xiàng)。我不確定實(shí)現(xiàn)這一目標(biāo)的最佳方法,但我認(rèn)為這將是最好的解決方案。我正在尋找有關(guān)如何完成此任務(wù)的建議。
1 回答

阿晨1998
TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊
您可以使用F() 對空值進(jìn)行排序,如下所示:
queryset = MyModel.exclude_denied.filter(user=user).order_by(
F("end_date").desc(nulls_first=True),
"primary",
"-amount"
)
更新
在來回發(fā)表評論并重新閱讀您的問題之后,我突然想到您并不想對 的值進(jìn)行排序end_date,而只想對它是否為 null 進(jìn)行排序。可能有更好的方法可以end_date is NULL直接轉(zhuǎn)換為布爾值,但我認(rèn)為這應(yīng)該可行:
from django.db.models import Count
queryset = MyModel.exclude_denied.filter(user=user).annotate(
num_end_date=Count("end_date")
).order_by(
"num_end_date",
"primary",
"-amount"
)
添加回答
舉報(bào)
0/150
提交
取消