如何像论坛一样对查询集进行排序?
我的意思是按一个日期字段订购,并且会有另一个订购日期 用于排序,例如在论坛中:主题按创建日期(或更新日期)排序,但如果任何旧主题收到新回复,则它将显示在其他主题之前。这正是我想要做的。
到目前为止我尝试过的:
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 。
一次只做一件事。
您想要排序
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')
现在您已经对所有至少有一个回复的主题进行了排序,但是没有回复的主题又如何呢?
我们可以这样重新表述排序:“如果有回复,则按上次回复日期排序,否则按上次主题更新”。
“否则”部分可以通过 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/