Поле модели для неявного отношения «многие ко многим (многие ко многим ко многим)» в Django - PullRequest
1 голос
/ 20 марта 2020

Допустим, в моих моделях для приложения django у меня есть три модели, каждая из которых имеет отношение ко многим (это пример с игрушкой).

class User(models.Model):

    permissions_group = models.ManyToManyField(Group)

class Group(models.Model):

    permissions_area = models.ManyToManyField(Area)

class Area(models.Model):
    #other irrelevant field data...
    pass

Я хотел бы иметь поле в моей модели User, которое выражает отношения между пользователями и областями, что является неявной моделью «многие ко многим» (то есть я не определяю дополнительные отношения, которые создают дополнительные таблицы в базе данных, я использую отношения, которые проходят через группы).

Я рассмотрел вопрос об использовании настраиваемого менеджера, но, похоже, он не позволяет выполнять фильтрацию отношений, которую можно увидеть с помощью стандартного менеджера RelatedField; Я мог бы просто установить украшенное свойство для класса:

class User(models.Model):

    @property
    permissions_areas(self):
        return Area.objects.filter(group__in=self.permissions_groups.all())

Но это кажется неуклюжим и не использует никаких соглашений django. Есть ли обычный способ сделать это в django, используя инструменты Django (пользовательские менеджеры или что-то похожее на RelatedManager), которые мне не хватает?

1 Ответ

1 голос
/ 20 марта 2020

Вы можете просто использовать два подчеркивания для просмотра отношения, поэтому:

class User(models.Model):

    @property
    permissions_areas(self):
        return Area.objects.filter(<b>group__user=self</b>).distinct()

.distinct() полезно, если User может принадлежать нескольким группам, которые имеют доступ к этой области. Без .distinct() он вернул бы это Area для каждой группы, которая имеет разрешение на эту область и к которой принадлежит пользователь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...