我正在尝试以特定方式订购查询集,但不知道该怎么做。首先,我希望它按降序排序end_date- 首先将任何空end_date记录分组。然后列表应该按primary字段排序,然后是降序amount。queryset = MyModel.exclude_denied.filter(user=user).order_by( "end_date", "primary", "-amount" )这是我目前拥有的,但它并没有像我想要的那样返回它。我希望这些组看起来像这样:没有的项目end_dateprimary首先列出的项目,然后按 desc 排序amount项目与end_dateprimary首先列出的项目,然后按 desc 排序amount我正在尝试实现这样的查询集: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适当的方法创建此订单?我觉得它很近 - 但不完全在那里。我认为更好的方法是创建 2 个查询集,然后将它们合并在一起以保持它们的顺序。像这样的东西:Queryset1 = 没有的项目end_date,降序primary,然后降序amountQueryset2 = 具有end_date(desc)、降序primary、降序的项目amount合并两个 Queryset,但首先按顺序列出 Queryset1 项,然后列出 Queryset2 项。我不确定实现这一目标的最佳方法,但我认为这将是最好的解决方案。我正在寻找有关如何完成此任务的建议。
1 回答
阿晨1998
TA贡献2037条经验 获得超6个赞
您可以使用F() 对空值进行排序,如下所示:
queryset = MyModel.exclude_denied.filter(user=user).order_by(
F("end_date").desc(nulls_first=True),
"primary",
"-amount"
)
更新
在来回发表评论并重新阅读您的问题之后,我突然想到您并不想对 的值进行排序end_date,而只想对它是否为 null 进行排序。可能有更好的方法可以end_date is NULL直接转换为布尔值,但我认为这应该可行:
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"
)
添加回答
举报
0/150
提交
取消