首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模型中的Django聚合

模型中的Django聚合
EN

Stack Overflow用户
提问于 2011-05-26 04:28:20
回答 2查看 2.2K关注 0票数 1

嗨,我正在编码一个网站,使用捐赠作为一个项目的多个项目。我正在计算捐款总额,但似乎不管用。我是否需要一个介于两个模型之间的中间表?

我想知道是否有更好的方式来实现Django聚合。

代码语言:javascript
复制
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

谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-26 05:20:01

我将去掉progess方法,简单地对查询集进行注释:

代码语言:javascript
复制
from django.db.models import Sum
Project.objects.annotate(progress=Sum('donations__amount'))

您甚至可以使用自定义的Manager

代码语言:javascript
复制
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()

然后:

代码语言:javascript
复制
>>> projects = Project.objects.all_with_progress()
>>> projects[0].progress
700

或者,您甚至可以覆盖默认的查询集,以便始终返回进度:

代码语言:javascript
复制
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'))

然后:

代码语言:javascript
复制
>>> projects = Project.objects.all()
>>> projects[0].progress
700
票数 4
EN

Stack Overflow用户

发布于 2011-05-26 04:37:59

代码语言:javascript
复制
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版本支持聚合。

编辑:修复了一个没有返回的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6130481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档