Доступ к нескольким отношениям "многие ко многим" в шаблоне django

class Account(models.Model):
    accountId = models.CharField(max_length=20, primary_key=True)
    username = models.CharField(max_length=30)
    
    def __str__(self):
        return self.username
class Project(models.Model):
    projectId = models.CharField(max_length=20, primary_key=True, default=idgen)
    projectName = models.CharField(max_length=20)
    projectOwner = models.ForeignKey(User, on_delete=models.CASCADE, related_name="owner")
    projectSize = models.IntegerField(default=25)
    projectGuests = models.ManyToManyField(User, related_name="guests")
    projectAccounts = models.ManyToManyField(Account, "accounts")

    def __str__(self):
        return self.projectId

В этом коде пользователи могут иметь несколько проектов, а проекты могут иметь несколько учетных записей. Есть ли способ передать в шаблон только 'user' (или не передавать ничего, поскольку мы можем получить пользователя с помощью запроса), чтобы получить все счета во всех проектах, которыми владеет пользователь, без использования цикла for? Потому что мне нужно отобразить количество счетов в целом, которыми владеет пользователь.

например, если у пользователя 2 проекта и в каждом проекте 2 счета... есть ли способ получить конечное значение 4 в шаблоне, просто используя объект user?

Попробуйте этот запрос

accounts = Project.objects.filter(projectOwner=request.user).projectAccounts_set.all()

Я решил все-таки сделать это в views.py, так как в templates это выглядит невозможным.

accs = []
for project in request.user.owner.all():
    for account in project.projectAccounts.all():
        accs.append(account)
accs = list( dict.fromkeys(accs))

это было простое решение. уверен, что есть более простые и эффективные способы сделать это.

Лучше всего выполнять такую арифметику в представлениях Django, а не в шаблонах 21404051.

Сначала выберите все проекты, связанные с request.user по

projects = Project.objects.filter(projectOwner=request.user)
                  .annotate(pc = Count('projectAccounts'))
                  .aggregate(total = Sum('pc'))

Теперь в шаблоне

{{ projects.total }}
Вернуться на верх