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

如何在Django的Account类中使用ManyToManyField实现关注系统

实现Django账户关注系统的正确方式

你当前的代码会报错,因为定义following字段时,Account类还未完成定义,直接引用类本身会触发名称未定义的问题。另外,默认的自关联多对多是对称关系,不符合单向关注的逻辑,需要额外配置参数。

正确的模型代码

class Account(models.Model):
    username = models.CharField(max_length=100)
    # 使用'self'指代当前模型,symmetrical=False关闭对称关联
    following = models.ManyToManyField(
        'self',
        blank=True,
        symmetrical=False,
        related_name='followers'  # 自定义反向关联名称,方便查询粉丝
    )

    def __str__(self):
        return self.username  # 可选,方便在后台查看对象名称

关键参数说明

  • 'self':用字符串形式引用当前模型,避免类未定义的问题,Django会在模型加载完成后解析这个关联。
  • symmetrical=False:默认自关联多对多是对称的(A关注B则B自动关注A),关闭后才能实现单向关注,符合实际的关注逻辑。
  • related_name='followers':自定义反向查询的名称,默认是account_set,改成followers后可以更直观地查询某个用户的粉丝列表。

使用示例

  1. 创建账户对象
jack = Account.objects.create(username='Jack')
harry = Account.objects.create(username='Harry')
helena = Account.objects.create(username='Helena')
  1. 关注操作
# Jack关注Harry和Helena
jack.following.add(harry, helena)

# Helena关注Jack
helena.following.add(jack)
  1. 查询操作
# 获取Jack关注的所有人
jack.following.all()  # 返回<QuerySet [<Account: Harry>, <Account: Helena>]>

# 获取Jack的所有粉丝
jack.followers.all()  # 返回<QuerySet [<Account: Helena>]>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:22:45