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

Django查询所有用户近2天首条博文时list调用filter报错如何解决

问题原因
  • 第一个报错:[user.blogpost_set.first() for user in ...] 生成的是Python原生列表,只有Django的QuerySet对象才有filter()方法,列表没有该属性,因此触发报错。
  • 第二个报错:列表的append()方法执行后返回值为None,直接在append()后调用filter()相当于对None对象调用方法,因此触发报错。
正确实现方案

我们要实现的是获取每个用户最近2天内发布的第一条博文,推荐以下两种写法:

写法1:性能最优(推荐)

利用Django的Prefetch对象提前过滤关联数据,避免循环查询数据库:
首先导入依赖:

from django.db.models import Prefetch
from django.utils import timezone
from datetime import timedelta

视图函数代码:

def first_posts(request):
    time_threshold = timezone.now() - timedelta(days=2)
    # 预查询时就过滤出近2天的博文,按发布时间倒序排列
    users = User.objects.prefetch_related(
        Prefetch(
            'blogpost_set',
            queryset=BlogPost.objects.filter(date__gte=time_threshold).order_by('-date'),
            to_attr='recent_posts'
        )
    )
    posts = []
    for user in users:
        # 仅保留有近2天博文的用户的第一条内容
        if user.recent_posts:
            posts.append(user.recent_posts[0])
    context = {'posts': posts}
    # 补充你自己的模板路径即可
    return render(request, '你的模板路径.html', context)

写法2:简易写法(适合用户量较小的场景)

def first_posts(request):
    time_threshold = timezone.now() - timedelta(days=2)
    posts = []
    for user in User.objects.all():
        # 逐个查询用户近2天的第一条博文
        first_recent_post = user.blogpost_set.filter(date__gte=time_threshold).order_by('-date').first()
        if first_recent_post:
            posts.append(first_recent_post)
    context = {'posts': posts}
    return render(request, '你的模板路径.html', context)

注意:你原代码中缺少了视图函数最后的return返回响应逻辑,补充自己的模板路径即可正常使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:48:00