首页 > 解决方案 > 使用 Django ManyToMany 对称属性构建传递依赖

问题描述

是否可以使用该symmetrical属性,models.ManyToManyField以便我可以在记录之间创建传递依赖关系?

例如,在我的代码中,我有:

class User(models.Model):
    website = models.ForeignKey('myapp.Website')
    related_users = models.ManyToManyField('self', related_name='users', symmetrical=True)

当我做:

user_a.related_users.add(user_b)
user_a.related_users.all() # returns the user B
user_b.related_users.all() # returns the user A

这里一切都按预期工作,关系是对称的。

但是当我这样做时:

user_b.related_users.add(user_c)
user_b.related_users.all() # returns user A and user C
user_c.related_users.all() # returns user B

我希望用户 C 自动返回用户 A 和用户 B,因为用户 C 是用户 B,即用户 A,因此用户 C 也是用户 A。

是否有可能实现这一点,还是我必须手动添加用户 A 和用户 C 之间的关联?

标签: pythondjangodjango-modelsmany-to-manymanytomanyfield

解决方案


一个简单的解决方案是编写一个自定义管理器,如果您只想深入一层,以下内容可能会奏效

class UserManager(models.Manager):
    def two_level_related(self):
        all_related = self.related_users.all()
        for related_user in self.related_users.all():
            all_related.union(related_user.related_users.all())
        return all_related

推荐阅读