Django访问子类属性之和

2024-04-19 20:14:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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'))
我使用了here的解决方案。

但我在尝试迁移时遇到以下错误:

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:这是我的第一个问题,请告诉我如何改进我的问题:)


Tags: nameselfmodels家庭familylength学生max
1条回答
网友
1楼 · 发布于 2024-04-19 20:14:34
我不认为“总费用”是家庭或学生的一个领域。我会选择家庭模型中的一种方法,用于查询该家庭中所有学生的费用

第一步是将总和聚合函数从django.db.models导入模型文件:

from django.db.models import Sum

然后,在族类中定义进行聚合的函数。注意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()

相关问题 更多 >