Django如何按当日点赞数排序查询今日热门帖子
问题原因分析
你的查询存在两个核心错误:
- 排序方向错误:
order_by('count')为升序排列,符合要求的点赞数从高到低需要改为倒序 - 时间类型不匹配:
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
相关产品推荐
相关产品推荐

