为了账号安全,请及时绑定邮箱和手机立即绑定

在多对多字段中使用自引用时,Django related_name 不起作用

在多对多字段中使用自引用时,Django related_name 不起作用

动漫人物 2023-09-12 19:05:53
我目前正在尝试在用户之间创建以下关系,因此我在用户模型中使用了多对多字段来引用自身。class User(AbstractUser):    followers = models.ManyToManyField('self', related_name='following')    def __str__(self):        return self.username但是,当我使用 shell 测试此模型并尝试访问 related_name 时,它报告发生了错误。>>> u1 = User.objects.get(pk=1)>>> u1.following.all()Traceback (most recent call last):  File "<console>", line 1, in <module>AttributeError: 'User' object has no attribute 'following'现在我真的很困惑,真的需要帮助或其他方法来做到这一点。
查看完整描述

3 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

它应该看起来像这样

class User(AbstractUser):

    followers = models.ManyToManyField(

        'self',

        symmetrical=False,

        related_name='following',

    )


查看完整回答
反对 回复 2023-09-12
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

我认为 Django 不允许我们在字段引用自身时给出 related_name 。

他们本质上做的是创建另一个名为 Following() 的模型,并用它来存储关系。

class Following(models.Model):
    target = models.ForeignKey('User', on_delete=models.CASCADE, related_name = "followers")
    follower = models.ForeignKey('User', on_delete=models.CASCADE, related_name = "targets")



查看完整回答
反对 回复 2023-09-12
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

如果将多对多关系指定给其他模型,则 related_name 属性指定从用户模型返回到您的模型的反向关系的名称。

但在这种情况下......两个模型是相同的

所以你试试这个

u1 = User.objects.get(pk=1) u1.followers.all()


查看完整回答
反对 回复 2023-09-12
  • 3 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信