Django查询当前登录用户关注者的帖子仅展示单用户内容如何解决
问题原因
视图函数中的for循环存在逻辑错误:每次遍历关注用户时,都会给posts变量重新赋值,循环结束后posts仅会保留最后一个遍历到的关注用户的帖子,因此页面只展示一名用户的内容。
同时原代码中profile = Profile.objects.filter(user = user)返回的是查询集而非单个Profile对象,若模板需要调用单个Profile属性会出现异常。
修复方案
推荐方案:优化ORM查询(仅需1次数据库查询,性能更高)
直接使用Django ORM跨表查询获取所有关注用户的帖子,修改followerspost视图代码如下:
def followerspost(request): user = request.user # 改用get获取单个Profile对象 profile = Profile.objects.get(user = user) followings = user.profile.followings.all() # 批量查询所有关注用户的帖子,按发布时间倒序排列符合社交产品使用习惯 posts = NewPost.objects.filter(user__in=followings).order_by('-timestamp') return render(request,"network/following.html",{ "user" : user, "profile" : profile, "followings" : followings, "posts" : posts, })
可选方案:保留循环逻辑(不推荐,关注用户较多时会产生多次数据库查询,性能较差)
初始化空查询集存储所有帖子,每次遍历后合并查询结果:
def followerspost(request): user = request.user profile = Profile.objects.get(user = user) followings = user.profile.followings.all() # 初始化空的NewPost查询集 posts = NewPost.objects.none() for following in followings: # 合并当前关注用户的帖子到总查询集 posts |= NewPost.objects.filter(user = following) # 统一按发布时间倒序 posts = posts.order_by('-timestamp') return render(request,"network/following.html",{ "user" : user, "profile" : profile, "followings" : followings, "posts" : posts, })
额外优化建议
模板中循环变量名存在重名问题,容易引发潜在异常,建议修改:
将{% for posts in posts %}调整为{% for post in posts %},对应循环内的posts.user、posts.timestamp、posts.post同步修改为post.user、post.timestamp、post.post,逻辑更清晰。
内容的提问来源于stack exchange,提问作者lony235
相关产品推荐
相关产品推荐

