2011-07-22 73 views
0

我在我的应用程序中设置了以下型号:Django - 如何从多对多关系中的中介模型中检索数据?

  • 学生
  • 评价

的课程和学生车型必须通过评估一个多到多的关系。在评估模式中,我还存储了课程收到的费用。我知道我应该真的把它存储在课程模型中,然后乘以学生人数,但有时出于某种原因,学生可能无法全额支付课程费用,所以我需要对个人基础进行跟踪。

我想在给定的时间内创建所有课程的列表,包括显示教训

  • 在收到所有课程的总金额收到

    1. 总量列那段时间。

    目前,我只是用一个通用视图返回的教训和我有我的课模型中定义一个简单的方法,计算出接收到的总费用:

    def total_fee(self): 
        evaluations = self.evaluation_set.all() 
        total = 0; 
        for e in evaluations: 
         total += e.fee_paid 
    
        return total 
    

    不过,我m运行调试工具栏,这告诉我,当我运行它时,这个视图需要87个独立的SQL查询!

    显然,我不能每次都这么做。我怎样才能一次获取所有数据?

    任何意见将不胜感激。

    谢谢。

  • 回答

    0

    我想我会亲自处理这个使用Django的Aggregation功能。这是我很难概念化你的数据库结构没有看到你的模型,但我想调用看起来是这样的:

    from django.db.models import Sum 
    total = self.evaluation_set.all().aggregate(total=Sum('fee_paid'))['total'] 
    

    这应该给你的赔偿了所有的评估集合中的所有费用的总和我认为1个数据库调用。因为我没有测试过它,所以要用一粒盐来做。

    希望有所帮助。

    +0

    谢谢,大概这会给他们所有人的总数?它也可以用于单个行吗?各行的 – Dan

    +0

    查看注释功能。 [django-annotations](https://docs.djangoproject.com/en/dev/topics/db/aggregation/#generating-aggregates-for-each-item-in-a-queryset) – mklauber

    +0

    这将总结所有的给定查询集中所有行中'fee_paid'的列值。这将是所有费用的总和。我不确定你对个别行的问题的含义。你怎么能总结一排? :-) 如果你的意思是它可以在另一个行子集上工作,那么是的。另外,如果您认为这可以正确回答您的问题,请将其标记为已回答并给我一个投票。非常感谢。谢谢。 – jnadro52

    相关问题