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

Django中如何访问ManyToMany关联表存储的数据(关注列表查询场景)

问题根因

你当前的查询返回Follow对象列表是模型关系的正常表现:你给Follow模型中指向User的外键设置了related_name="follows",因此调用user.follows.all()时,拿到的是该用户关联的所有Follow实例,你需要的关注用户数据存储在每个Follow实例的follow多对多字段中。

解决方案

方案1:基于现有模型直接查询(无需修改模型定义)

只要从返回的Follow实例中读取多对多字段的内容即可:

user = User.objects.get(id=user_id)
# 先获取该用户对应的Follow实例
user_follow_obj = user.follows.first()
# 读取follow字段存储的所有关注用户
following_users = user_follow_obj.follow.all()

你可以直接遍历following_users拿到每个用户的所有属性。

方案2:优化模型结构(更符合Django开发惯例)

你当前的Follow模型设计存在冗余,如果你需要存储关注关系的额外属性(比如关注时间),推荐调整为通过中间表定义多对多关系的标准写法:

class User(AbstractUser):
    # 对称=False表示关注关系不是双向的,A关注B不代表B关注A
    following = models.ManyToManyField(
        "self",
        symmetrical=False,
        related_name="followers",
        through="Follow"
    )

class Follow(models.Model):
    # 关注发起者
    from_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="active_follows")
    # 被关注者
    to_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="passive_follows")
    # 可自行添加额外字段,比如关注时间
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        # 避免重复关注同一个用户
        constraints = [
            models.UniqueConstraint(fields=["from_user", "to_user"], name="unique_follow_relation")
        ]

调整后查询逻辑会更简洁:

user = User.objects.get(id=user_id)
# 直接获取该用户关注的所有人
following_users = user.following.all()
# 直接获取该用户的所有粉丝
follower_users = user.followers.all()

方案3:直接访问中间表内容

你提到的network_follow_follow是Follow模型中follow多对多字段自动生成的中间表,你可以通过如下方式直接操作该表:

# 获取自动生成的中间表模型
FollowMidTable = Follow.follow.through
# 读取中间表所有数据
all_follow_relations = FollowMidTable.objects.all()
# 过滤查询某个用户发起的所有关注关系
user_relations = FollowMidTable.objects.filter(follow_id=user_id)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:36:03