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

标签 python django

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

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

到目前为止我尝试过的:

    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 替换为我们选择的另一个表达式。在我们的例子中,它将用 updated_date 替换 Max() 内部的内容。主题字段:

    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/

相关文章:

Python Apyori 按提升排序

python - 关闭 python MySQL 脚本

python - 干净地处理终端上的用户输入而不会崩溃

django - django中的redirect_field_value是什么意思

python - Django bulk_create 函数示例

python - 值错误 : View function did not return a response not caught by Exception exception handler

python - 过滤标点符号附近的停用词

mysql - 如何解决 MySQL 和 Django Admin 外键约束

javascript - 有没有办法在 Django Admin 弹出窗口(添加、更新、删除)完成时调用 Javascript 函数?

python - Django Rest框架从Serializer继承一个类并使其抽象