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

如何在Django中获取上周评论最多的文章(按外键频次排序)

获取上周评论最多的文章

可以通过Django ORM的annotate、filter和order_by方法实现需求,具体代码如下:

步骤1:导入依赖

from datetime import datetime, timedelta
from django.db.models import Count, Q
from .models import Post

步骤2:计算时间范围

情况1:过去7天的评论

如果“上周”指当前时间往前推7天的范围:

# 计算7天前的时间点
last_week_start = datetime.now() - timedelta(days=7)

情况2:严格自然周(以上周一到上周日为例)

如果需要统计完整的上一周(如周一至周日),可这样计算时间范围:

today = datetime.now()
# 计算上周一的起始时间(weekday()返回0=周一,6=周日)
last_monday = today - timedelta(days=today.weekday() + 7)
# 计算上周日的结束时间(精确到秒)
last_sunday = last_monday + timedelta(days=6, hours=23, minutes=59, seconds=59)

步骤3:查询并排序文章

对应情况1的查询

# 统计每个Post的上周评论数,并按评论数降序排列
popular_posts = Post.objects.annotate(
    comment_count=Count(
        'comment',
        filter=Q(comment__date__gte=last_week_start)
    )
).order_by('-comment_count')

对应情况2的查询

popular_posts = Post.objects.annotate(
    comment_count=Count(
        'comment',
        filter=Q(comment__date__range=(last_monday, last_sunday))
    )
).order_by('-comment_count')

补充说明

  • 若只想保留有上周评论的文章,可在annotate后添加.filter(comment_count__gt=0)
  • 模型中的date字段使用datetime.now()可能存在时区问题,建议替换为django.utils.timezone.now(),并确保项目配置了正确的时区设置
  • Count的filter参数用于仅统计符合时间范围的评论,避免统计所有历史评论

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 17:21:01