为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

回首忆惘然 2022-05-24 16:07:39
我正在尝试以特定方式订购查询集,但不知道该怎么做。首先,我希望它按降序排序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"

)


查看完整回答
反对 回复 2022-05-24
  • 1 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信