Доступ к нескольким отношениям "многие ко многим" в шаблоне 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 }}