嗨,我正在编码一个网站,使用捐赠作为一个项目的多个项目。我正在计算捐款总额,但似乎不管用。我是否需要一个介于两个模型之间的中间表?
我想知道是否有更好的方式来实现Django聚合。
class Donation(models.Model):
user = models.ForeignKey(User)
amount= models.DecimalField(max_digits=12, decimal_places=2)
def __unicode__(self):
return self.user
class Project(models.Model):
name = models.CharField(max_length=200)
donations=models.ManyToManyField(Donation, null=True, blank=True)
def __unicode__(self):
return self.name
def progress(self):
donations = self.donations.all()
total_donations = 0
for item in donations:
total_donations += item.amount
return total_donations谢谢你的帮助!
发布于 2011-05-26 05:20:01
我将去掉progess方法,简单地对查询集进行注释:
from django.db.models import Sum
Project.objects.annotate(progress=Sum('donations__amount'))您甚至可以使用自定义的Manager
from django.db.models import Sum
class ProjectManager(models.Manager):
def all_with_progress(self):
return self.get_query_set().annotate(progress=Sum('donations__amount'))
class Project(models.Model)
...
objects = ProjectManager()然后:
>>> projects = Project.objects.all_with_progress()
>>> projects[0].progress
700或者,您甚至可以覆盖默认的查询集,以便始终返回进度:
class ProjectManager(models.Manager):
def get_query_set(self, *args, **kwargs):
qs = super(ProjectManager, self).get_query_set(*args, **kwargs)
return qs.annotate(progress=Sum('donations__amount'))然后:
>>> projects = Project.objects.all()
>>> projects[0].progress
700发布于 2011-05-26 04:37:59
def progress(self):
from django.db.models import Sum
amount = self.donations.exclude(amount=None).aggregate(progress=Sum('amount'))['progress']
if amount:
return amount
return 0我想那会给你你想要的。你得试一试,如果你有什么问题就告诉我。此外,请确保您的Django版本支持聚合。
编辑:修复了一个没有返回的问题。
https://stackoverflow.com/questions/6130481
复制相似问题