Django Сумма доступа атрибутов дочернего класса - PullRequest
0 голосов
/ 13 июля 2020

Я новичок и работаю над программой управления школьными сборами с Django. Моя проблема ниже:

У меня две модели, Студент и Семья:

from django.db import models

--snip--
class Family(models.Model):
    father = models.CharField(max_length=100)
    mother = models.CharField(max_length=100)
    total_fees = students.fees.aggregate(models.Sum('fees'))

    def __str__(self):
        return self.father+" " +self.mother

class Student(models.Model):
    family = models.ForeignKey(Family, on_delete=models.CASCADE, related_name='students', default='')
    name = models.CharField(max_length=100)
    date_of_birth = models.DateField('Date Of Birth')
    fees = models.IntegerField(default=0)
    email= models.CharField(max_length=200)

    def __str__(self):
        return self.name

Я пытаюсь получить все общие сборы семьи, сложив сборы всех студентов в семья:
total_fees = students.fees.aggregate(models.Sum('fees'))
Я использовал решение, указанное здесь .

но я получаю эту ошибку, когда пытаюсь выполнить миграцию:

File "/home/my_username/mysite/students_app/models.py", line 34, in Family
    total_fees = students.fees.aggregate(models.Sum('fees'))
AttributeError: 'ForeignKey' object has no attribute 'fees' 

Как правильно рассчитать общую сумму платы за семью?

Спасибо!

PS: Это мой первый вопрос, скажите, пожалуйста, как я могу улучшить свои вопросы :)

1 Ответ

0 голосов
/ 13 июля 2020

Я бы не стал рассматривать «Общие сборы» как поле семьи или студента. Я бы выбрал метод в модели 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...