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

