You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django如何按当日点赞数排序查询今日热门帖子

问题原因分析

你的查询存在两个核心错误:

  1. 排序方向错误:order_by('count')为升序排列,符合要求的点赞数从高到低需要改为倒序
  2. 时间类型不匹配:datetime.today()生成的是不带时区的原生时间,和VoteDate模型中date字段使用的带时区的timezone.now()存在匹配偏差,会导致统计结果不准

另外如果你的需求是「仅展示当日发布的帖子」,当前Post模型缺少发布时间字段,需要先补充字段再调整查询逻辑。


方案1:展示所有帖子,按当日获赞数倒序取前30

不需要修改模型,直接修正查询代码即可:

from django.utils import timezone
from django.db.models import Count, Q

# 获取带时区的当日日期,避免时区匹配错误
today = timezone.localdate()
hot_today = Post.objects.annotate(
    today_vote_count=Count('votedate', filter=Q(votedate__date=today))
).order_by('-today_vote_count')[:30]

方案2:仅展示当日发布的帖子,按当日获赞数倒序取前30

首先修改Post模型补充发布时间字段:

class Post(models.Model):
    name = models.CharField(max_length=40, default=None, null=False)
    cover = models.CharField(max_length=100, default=None, null=True, blank=True)
    content = models.TextField(max_length=2000, default=None, null=False)
    # 新增发布时间字段,创建时自动赋值
    publish_time = models.DateTimeField(default=timezone.now)

执行模型迁移后使用如下查询代码:

from django.utils import timezone
from django.db.models import Count, Q

today = timezone.localdate()
hot_today = Post.objects.filter(
    # 过滤仅保留当日发布的帖子
    publish_time__date=today
).annotate(
    today_vote_count=Count('votedate', filter=Q(votedate__date=today))
).order_by('-today_vote_count')[:30]

注意事项

请确保项目settings.py中配置了正确的时区参数,示例如下:

TIME_ZONE = 'Asia/Shanghai'
USE_TZ = True

内容的提问来源于stack exchange,提问作者Lunachan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:27:01