高级查询集排序不会像我那样排序

2024-10-02 00:36:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图让queryset以特定的方式进行订购,但不知道如何进行订购

首先,我希望它按end_date降序排序,将所有空的end_date记录首先分组

然后列表应该按primary字段排序,然后按降序amount

queryset = MyModel.exclude_denied.filter(user=user).order_by(
        "end_date", "primary", "-amount"
    )

这是我目前拥有的,但它没有完全返回它,因为我喜欢它

我希望这些组显示如下:

  • 没有end_date的项目

    • primary项先列出,然后按descamount排序
  • 带有end_date的项

    • primary项先列出,然后按descamount排序

我试图实现这样一个查询集:

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适当的方法创建这个订单吗?我觉得离这儿很近,但不太近

我认为一个更好的方法是创建两个查询集,然后将它们合并在一起保持它们的顺序

像这样:

Queryset1=没有end_date的项,降序primary,然后降序amount

Queryset2=items与end_date(desc),降序primary,然后降序amount

合并这两个查询集,但先按顺序列出Queryset1项,然后列出Queryset2项

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

我在寻找如何实现这一目标的建议


Tags: nonefalsedateby排序方式orderamount
1条回答
网友
1楼 · 发布于 2024-10-02 00:36:59

您可以使用F() to sort null values,类似于:

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"
)

相关问题 更多 >

    热门问题