Использование симметричного свойства Django ManyToMany для построения транзитивной зависимости - PullRequest
0 голосов
/ 21 сентября 2018

Можно ли использовать свойство 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?

1 Ответ

0 голосов
/ 21 сентября 2018

Одним из простых решений было бы написание собственного менеджера, что-то вроде следующего может помочь, если вы хотите пройти только на один уровень глубже

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...