【问题标题】:Many-to-many relationship with itself can't utilize the related name attribute与自身的多对多关系不能利用相关名称属性
【发布时间】:2017-02-21 21:01:39
【问题描述】:

我正在尝试制作 Twitter 克隆。

该应用有一系列用户,每个用户都有一个用户个人资料。 UserProfile模型如下

class UserProfiles(models.Model):
    authenticated_user = models.OneToOneField(User, related_name="user_profile")

    handle = models.CharField(max_length=50)
    display_name = models.CharField(max_length=50)

    following = models.ManyToManyField("self", related_name="followers", null=True)

    def __str__(self):
        return self.authenticated_user.handle

“关注”属性与 UserProfiles 是多对多的关系,因为每个用户配置文件都可以关注许多其他配置文件,并且许多配置文件可以关注另一个配置文件。

如果我有一个 UserProfiles 实例,我们将其命名为 current_user,我可以通过以下操作找到它关注了多少个配置文件

current_user.following.count

我还希望能够告诉用户有多少人在关​​注他们。由于related_name 参数设置为“追随者”,我可以通过这样做来获得追随者的数量似乎是合理的

current_user.followers.count

然而,这会返回一个错误,“'UserProfiles' 对象没有属性 'followers'”

为什么我所做的不起作用?我能做些什么呢?

【问题讨论】:

  • 您在添加related_name 后运行了makemigrationsmigrate

标签: django models


【解决方案1】:

django 中默认的 m2m 与 self 的关系是对称的。如果你看documentation

当 Django 处理这个模型时,它识别出它自己有一个ManyToManyField,因此,它没有向Person 类添加一个person_set 属性。相反,ManyToManyField 被假定为 symmetrical——也就是说,如果我是你的朋友,那么你就是我的朋友。

如果您不希望与self 的多对多关系对称,请将symmetrical 设置为False。这将强制 Django 为反向关系添加描述符,允许 ManyToManyField 关系是非对称的。

在您的情况下,由于 m2m 关系的 symmetrical 属性为真,这意味着:

A is following B => B is following A

但如果您需要followingfollowers 关系,则需要设置symmetrical=False

following = models.ManyToManyField("self", related_name="followers", 
                                   symmetrical=False, null=True)

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 2012-10-27
    • 2022-10-25
    相关资源
    最近更新 更多