首页 > 解决方案 > django order_by 任一列(日期以最近为准)

问题描述

我想按最近的comment.created 或post.published_date 对我的帖子进行排序(如果还没有评论)。

posts_all =ForumPost.objects.all().filter(published_date__lte=timezone.now()).prefetch_related('comments')

posts=posts_all.annotate(max_activity=Max('comments__created')).order_by('-max_activity','-published_date')

使用上面的代码,它首先显示所有带有评论的帖子(按最近的评论活动排序),然后是所有没有评论的帖子(按最近发布的排序)。

我真正想要的是最近发表的评论或最近发表的文章。任何想法?谢谢。

编辑:使问题更清楚如果有帖子 A 没有评论并在 5 分钟前发布,并且帖子 B 有评论,最近评论是在 20 分钟前创建的;帖子 A 应高于帖子 B。

标签: django

解决方案


如果返回,您可以使用Coalesce函数 [Django-doc]提供一个值(如果没有要聚合的值,则会发生这种情况:Max('comments__created')NULL

from django.db.models.functions import Coalesce

posts = posts_all.annotate(
    max_activity=Coalesce(Max('comments__created'), 'published_date')
).order_by('-max_activity')

推荐阅读