django - 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。
解决方案
如果返回,您可以使用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')
推荐阅读
- reactjs - 从项目的 Github 存储库中提取新 udates 后出现 Graphql 错误
- c# - 按钮单击时颜色更改文本
- sql - 在sql中使用pivot的多行
- python - 如何在 setup.py 中指定 `--formats` sdist 选项?
- html - HTML 将页脚内容与页面包装器对齐
- sql - oracle数据库在表列'SYS_###########'中创建什么?
- twilio - Twilio 按内容过滤消息?
- docker - 在 Fedora Docker Image 中找不到任何手册页
- user-interface - 如何在Install4j中禁用屏幕的十字按钮
- django - 数据没有保存到数据库中,而是显示在 Django 的终端上