【发布时间】:2020-01-11 07:10:06
【问题描述】:
我正在尝试让查询集以特定方式排序,但不知道该怎么做。
首先,我希望它按降序排列 end_date - 任何空的 end_date 记录首先分组。
那么列表应该按primary字段排序,然后是降序amount。
queryset = MyModel.exclude_denied.filter(user=user).order_by(
"end_date", "primary", "-amount"
)
这是我目前拥有的,但它并没有像我想要的那样返回它。
我希望组显示如下:
-
没有
end_date的项目-
primary项目首先列出,然后按 desc 排序amount
-
-
带有
end_date的项目-
primary项目首先列出,然后按 desc 排序amount
-
我正在尝试实现这样的查询集:
ItemA - end_date:None - primary:True
ItemB - end_date:None - primary:False
ItemC - end_date:None - primary:False
ItemD - end_date:08/10/2018 - primary:True
ItemE - end_date:07/10/2019 - Primary:False
ItemF - end_date:06/08/2018 - Primary:False
ItemG - end_date:04/16/2017 - Primary:False
是否尝试仅使用 order_by 适当的方法创建此订单?我觉得它很接近 - 但不完全在那里。
我认为更好的方法是创建 2 个查询集,然后将它们合并在一起以保持它们的顺序。
类似这样的:
Queryset1 = 没有end_date 的项目,降序primary,然后降序amount
Queryset2 = 带有end_date(desc)的项目,降序primary,然后降序amount
合并两个 Queryset,但保持 Queryset1 项首先按顺序列出,然后 Queryset2 项按顺序列出。
虽然我不确定实现这一目标的最佳方法,但我认为这将是最好的解决方案。
我正在寻找有关如何完成此任务的建议。
【问题讨论】:
-
您从未提及您最初的方法到底出了什么问题。是否是带有 null
end_date的对象出现故障? -
不清楚“with end_date”是否应该按 end_date 排序,首先似乎是,但是当你解释你想要什么时,它似乎不再那样了。是否有多个具有相同 end_date 的项目应按主要排序,数量在它们已按 end_date 排序(和分组)?
-
@dirkgroten - 是的,可以有多个具有相同 end_date 的项目应该由
primary排序,然后是amount在它们已经排序/分组之后结束日期
标签: python django django-queryset