gpt4 book ai didi

python - django 按不同领域的最新日期对查询集进行排序

转载 作者:太空宇宙 更新时间:2023-11-04 09:45:18 24 4
gpt4 key购买 nike

如何像论坛一样对查询集进行排序?

我的意思是按一个日期字段排序,然后会有另一个订单日期用于排序,例如在论坛中:主题按创建日期(或更新日期)排序,但如果任何旧主题得到新回复,则它将显示在其他主题之前。这正是我想要做的。

到目前为止我尝试了什么:

    subjects = Subjects.objects.filter(active=True).order_by('-sticky', '-updated_date', 'reply__updated_date')

但在这种情况下,结果会重复作为回复计数。

我也试过:

    subjects = Subjects.objects.filter(active=True).order_by('-sticky', '-updated_date').order_by('reply__updated_date')

但在这种情况下,第二个 order_by 会覆盖第一个。

有什么指导方针可以遵循吗?

顺便说一句,我很确定你明白了,但要清楚一点,Subject 是一个模型,而 Reply 是另一个模型,通过外键连接。

最佳答案

如果我没看错,你可以使用 annotations 来实现。和 database functions .

一次做一件事。

  1. 您想按回复日期降序Subjects进行排序:用Django自己的术语来说,您需要 annotate() 每个 Subjects 及其相关模型的最大 updated_date reply,并对 Subjects 进行排序按相反顺序的新字段,如下所示:

    from django.db.models import Max

    subjects = Subject.objects.annotate(lr=Max('reply__updated_date'))\
    .order_by('-lr')
  2. 现在您已经对所有至少有一个回复的主题进行了排序,但是没有回复的主题呢?

    我们可以这样改写我们的排序方式:“如果有回复,则按上次回复日期排序,否则按上次主题更新”。

    “否则”部分可以通过 Coalesce() 实现函数,它将 NULL 替换为我们选择的另一个表达式。在我们的例子中,它会将 Max() 中的内容替换为 updated_date 字段的主题:

    from django.db.models import Max
    from django.db.models.functions import Coalesce

    subjects = Subject.objects\
    .annotate(lr=Coalesce(Max('reply__updated_date'), 'updated_date'))\
    .order_by('-lr')

关于python - django 按不同领域的最新日期对查询集进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50045234/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com