Я бы не стал рассматривать «Общие сборы» как поле семьи или студента. Я бы выбрал метод в модели Family, который запрашивает плату за всех студентов в этой семье.
Первый шаг - импортировать функцию агрегирования Sum из django .db.models в файл вашей модели:
from django.db.models import Sum
Затем определите функцию в своем классе Family, которая выполняет агрегирование. Обратите внимание, что aggregate () возвращает словарь пар имя-значение. Итак, поскольку ваш запрос был ранее настроен, он вернул бы что-то вроде: {'fees__sum': 100000}
.
Итак, вам нужно получить доступ к значению в словаре с помощью этого сгенерированного ключа, например:
Student.objects.filter(family=self).aggregate(Sum('fees'))['fees__sum']
Собираем все вместе:
from django.db.models import Sum
class Family(models.Model):
father = models.CharField(max_length=100)
mother = models.CharField(max_length=100)
def __str__(self):
return self.father+" " +self.mother
def get_students_total_fees(self):
return Student.objects.filter(family=self).aggregate(Sum('fees'))['fees__sum']
Таким образом, вы можете получить семейный объект и получить общую сумму:
family_object = Family.objects.get(Id=1)
family_students_fees_total = family_object.get_students_total_fees()