高级查询集排序排序 - 不会按我的意愿排序

我正在尝试以特定方式订购查询集,但不知道该怎么做。


首先,我希望它按降序排序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 项。


我不确定实现这一目标的最佳方法,但我认为这将是最好的解决方案。


我正在寻找有关如何完成此任务的建议。


回首忆惘然
浏览 85回答 1
1回答

阿晨1998

您可以使用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 Countqueryset = MyModel.exclude_denied.filter(user=user).annotate(    num_end_date=Count("end_date")).order_by(    "num_end_date",    "primary",     "-amount")
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python