Django - Вывод данных из связанных таблиц
Есть две таблицы, которые связанны между собой, как мне вывести количество студентов, которые связанны с конкретной категорией. Например:
"Какое-то наименование" - 22
"Еще какое-то наименование" - 10
Пытался через related_name и через filter, все мимо.
class Management(models.Model):
keyPeriods = models.ForeignKey(Periods, on_delete=models.CASCADE, related_name='school', verbose_name='Школа')
title = models.CharField(max_length=500, verbose_name="Наименование")
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('management_view', kwargs={"management_id": self.pk})
class Students(models.Model):
keyPeriod = models.ForeignKey(Periods, on_delete=models.CASCADE, related_name='period',
verbose_name='Школа')
keyManagement = models.ForeignKey(Management, on_delete=models.CASCADE, related_name='management', verbose_name='Учреждение|Рук-ль')
surname = models.CharField(max_length=300, verbose_name='Фамилия')
name = models.CharField(max_length=300, verbose_name='Имя')
patronymic = models.CharField(max_length=300, verbose_name='Отчество')
birthday = models.DateField(verbose_name='Дата рождения')
sex = models.CharField(max_length=1, choices=SEX, verbose_name='Пол')
snils = models.CharField(max_length=100, verbose_name='СНИЛС')
contract_date = models.DateField(verbose_name='Дата контракта')
contract_number = models.CharField(max_length=300, verbose_name='Номер контракта')
Ответы (1 шт):
Автор решения: Iaroslav Lukianchik
→ Ссылка
Я бы попробовал все же через filter. Вы же по полю Managment.title хотите фильтровать и считать студентов? Если да, то вот пример:
Students.objects.filter(keyManagement__title='Какое-то наименование').count()
Финальный вариант:
# получаем все обьекты Management и подсчитываем количество студентов для каждого:
management_set = Management.objects.annotate(num_students=Count('management'))
# перебираем каждый объект и выводим на консоль:
for management in management_set:
print(f'{management.title} : {management.num_students}')
# результат:
test_management_1 : 2
test_management_2 : 1
test_management_3 : 0