如何在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后可以更直观地查询某个用户的粉丝列表。
使用示例
- 创建账户对象
jack = Account.objects.create(username='Jack') harry = Account.objects.create(username='Harry') helena = Account.objects.create(username='Helena')
- 关注操作
# Jack关注Harry和Helena jack.following.add(harry, helena) # Helena关注Jack helena.following.add(jack)
- 查询操作
# 获取Jack关注的所有人 jack.following.all() # 返回<QuerySet [<Account: Harry>, <Account: Helena>]> # 获取Jack的所有粉丝 jack.followers.all() # 返回<QuerySet [<Account: Helena>]>
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

