Python 如何筛选多个对象的父属性?

Python 如何筛选多个对象的父属性?,python,django,many-to-many,Python,Django,Many To Many,我刚来Django,今天遇到了一个问题 我有两种型号,Program和Member。 型号.py from django.db import models from django.db.models import Sum class Program(models.Model): name = models.CharField(max_length=200) fee = models.IntegerField(default=10) # Arbitrary Property

我刚来Django,今天遇到了一个问题

我有两种型号,
Program
Member

型号.py

from django.db import models
from django.db.models import Sum

class Program(models.Model):
    name = models.CharField(max_length=200)
    fee = models.IntegerField(default=10)  # Arbitrary Property

class Member(models.Model):
    programs = models.ManyToManyField(Program, related_name='members')
    name = models.CharField(max_length=200)
    
    # I tried this but it gives me all of the sum of all the programs' fees :
    # fees_for_member = models.IntegerField(default=Program.objects.prefetch_related('members').aggregate(Sum('fee'))['fee__sum'])

    # This results in an error:
    # fees_for_member = programs.aggregate(Sum('fee'))['fee__sum']
     

    
    

每个程序都有一个
费用
成员
有一个名为
fees\u的整数字段,用于
或仅
费用
,其默认值是
成员
已注册的所有
程序费用之和

我的问题是,如何只过滤
成员所在的
程序

我尝试过
Program.objects.prefetch\u related('members').aggregate(Sum('fee'))['fee\uu Sum'])
,但它返回所有程序费用的总和

我还尝试了
programs.aggregate(Sum('fee'))['fee\u Sum']

但是它给了我这个错误:
AttributeError:“ManyToManyField”对象没有属性“aggregate”


我能为此做些什么?我知道我遗漏了什么,但我不确定是什么。我花了数小时搜索Django文档等,但我就是找不到答案,因此非常感谢您的帮助。

您应该为成员定义费用属性,而不是字段,因为这必须动态计算:

class Member(models.Model):
    programs = models.ManyToManyField(Program, related_name='members')
    name = models.CharField(max_length=200)

    @property
    def fees_for_member(self):
        return self.programs.aggregate(models.Sum('fee'))['fee__sum']
这应该行得通

解决方案2:

如果Program.fee也是一个属性,并且属性是python代码(不是数据库中的值),则不能使用数据库级操作。等效的解决方案是:

class Member(models.Model):
    programs = models.ManyToManyField(Program, related_name='members')
    name = models.CharField(max_length=200)

    @property
    def fees_for_member(self):
        return sum([p.fee for p in self.programs.all()])
关于此的一些文档: