【问题标题】:Django - How to retrieve data from intermediary model in many-to-many relationship?Django - 如何从多对多关系的中间模型中检索数据?
【发布时间】:2011-07-22 20:58:41
【问题描述】:

我在我的应用中设置了以下模型:

  • 课程
  • 学生
  • 评估

Lesson 和 Student 模型通过评估具有多对多关系。在评估模型中,我还存储了课程收到的费用。我知道我应该将其真正存储在课程模型中,然后乘以学生人数,但有时出于某种原因,学生可能无法支付全部课程费用,因此我需要逐个跟踪它。

我正在尝试创建给定时间段内所有课程的列表,并包含一个显示

的列
  1. 课程收到的总金额
  2. 该时间段内所有课程收到的总金额。

目前,我只是使用通用视图来返回所有课程,并且我在课程模型中定义了一个简单的方法来计算收到的总费用:

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

    return total

但是,我正在运行调试工具栏,这表明我在运行该视图时需要 87 个单独的 SQL 查询!

显然,我不能每次都这样做。如何一次性获取所有数据?

任何建议将不胜感激。

谢谢。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    我想我会使用 Django 的Aggregation 功能亲自解决这个问题。我很难在没有看到您的模型的情况下概念化您的数据库结构,但我认为调用看起来像这样:

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

    我认为,这应该会给您在 1 个 DB 调用中为评估集中的所有内容支付的所有费用的总和。因为我还没有测试过,所以对它持保留态度。

    希望对您有所帮助。

    【讨论】:

    • 谢谢,大概这会给所有人的总数?它也可以用于单个行吗?
    • 对于单个行查看注释函数。 django-annotations
    • 这将汇总给定查询集中所有行中“fee_paid”的所有列值。这将是支付的所有费用的总和。我不确定你对个别行的问题是什么意思。你怎么能总结 1 行? :-) 如果您的意思是它可以在另一个行子集上工作,那么可以。另外,如果您认为这正确回答了您的问题,请将其标记为已回答并给我投票。值得赞赏。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 2013-07-16
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    相关资源
    最近更新 更多