我刚来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']
每个程序都有一个fee
,并且Member
有一个名为fees_for_member
或fees
的整数字段,其默认值是Member
注册的所有Program fees
的总和
我的问题是,如何过滤member
所在的^{只是?
我尝试过Program.objects.prefetch_related('members').aggregate(Sum('fee'))['fee__sum'])
,但它返回所有程序费用的总和
我也尝试了programs.aggregate(Sum('fee'))['fee_sum']
,但它给了我这个错误:AttributeError: 'ManyToManyField' object has no attribute 'aggregate'
我能为此做些什么?我知道我遗漏了什么,但我不确定是什么。我花了几个小时在Django文档中搜索,但我就是找不到答案,所以非常感谢您的帮助
您应该为成员定义费用属性,而不是字段,因为这必须动态计算:
这应该行得通
解决方案2:
如果Program.fee也是一个属性,并且属性是python代码(不是数据库中的值),则不能使用数据库级操作。等效的解决方案是:
关于此的一些文档: https://docs.djangoproject.com/en/3.0/topics/db/models/#model-methods
相关问题 更多 >
编程相关推荐