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
相关产品推荐
相关产品推荐

