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

Django中如何通过关联模型查询关注用户发布的Post内容

问题原因

  1. 模型反向关联名语义混淆
    你当前Follow模型的related_name设置逻辑颠倒:
  • follower字段的related_name="follower":表示通过User.follower可以拿到该用户作为关注者的所有Follow记录(也就是这个用户关注了别人的记录)
  • following字段的related_name="following":表示通过User.following可以拿到该用户作为被关注者的所有Follow记录(也就是别人关注这个用户的记录)
    你在视图里调用user.following.all()本来想拿该用户关注的人的记录,实际拿到的是别人关注该用户的记录,逻辑完全颠倒。
  1. 视图查询逻辑错误
    user.following.all()返回的是Follow对象的查询集,你直接对查询集调用.following属性,自然会触发QuerySet没有following属性的报错。

解决方法

推荐方案:先调整模型反向关联名(语义更清晰,避免后续踩坑)

修改Follow模型的related_name设置,让命名和实际语义匹配:

class Follow(models.Model):
    follower = models.ForeignKey(
        User, on_delete=models.PROTECT, related_name="following_records")
    following = models.ForeignKey(
        User, on_delete=models.PROTECT, related_name='follower_records')

调整后语义:

  • user.following_records:拿到该用户作为关注者的所有Follow记录(该用户关注了别人的记录)
  • user.follower_records:拿到该用户作为被关注者的所有Follow记录(别人关注该用户的记录)

对应修改视图代码即可:

def following_page(request, username):
    user = User.objects.get(username=username)
    # 提取该用户关注的所有用户的ID列表
    following_users = user.following_records.values_list('following_id', flat=True)
    # 过滤出这些用户发布的帖子,按发布时间倒序
    posts = Post.objects.filter(poster_id__in=following_users).order_by("-date_created")
    return render(request, 'network/index.html', {
        "posts": posts
    })

不修改模型的临时方案

如果你不想改动模型定义,也可以直接基于现有反向关联名调整视图查询逻辑,注意现有配置下user.follower才是该用户作为关注者的Follow记录:

def following_page(request, username):
    user = User.objects.get(username=username)
    following_users = user.follower.values_list('following_id', flat=True)
    posts = Post.objects.filter(poster_id__in=following_users).order_by("-date_created")
    return render(request, 'network/index.html', {
        "posts": posts
    })

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:06:09