【问题标题】:Django: Summing values of records grouped by foreign keyDjango:对按外键分组的记录值求和
【发布时间】:2011-02-03 16:46:55
【问题描述】:

在 django 中,鉴于以下模型(略微简化),我正在努力弄清楚如何获得包含组总和的视图


    class Client(models.Model):
        api_key = models.CharField(unique=True, max_length=250, primary_key=True)
        name = models.CharField(unique=True, max_length=250)

    class Purchase(models.Model):
        purchase_date = models.DateTimeField()
        client = models.ForeignKey(SavedClient, to_field='api_key')
        amount_to_invoice = models.FloatField(null=True)

对于给定的月份,我想查看例如


April 2010

For Each Client that purchased this month:
*   CLient:  Name
*   Total amount of Purchases for this month
*   Total cost of purchases for this month

 For each Purchase made by client:
  * Date
  * Amount
  * Etc

我一直在研究 django 注释,但不知道如何在特定月份对特定组的字段值求和并将信息作为变量/标签发送到模板。

任何信息将不胜感激

【问题讨论】:

    标签: django django-templates django-views


    【解决方案1】:

    您可以使用聚合而不是注释:http://docs.djangoproject.com/en/dev/topics/db/aggregation/#topics-db-aggregation

    添加一个客户端方法会很方便:

    class Client(models.Model):
        api_key = models.CharField(unique=True, max_length=250, primary_key=True)
        name = models.CharField(unique=True, max_length=250)
    
        def get_purchases_month(self, y, m):
            return self.purchase_set.filter(purchase_date__year=y, purchase_date__month=m).aggregate(purchase_sum=Sum("amount_to_invoice"))
    

    您不能直接从模板中使用它,因为无法从那里传递参数。至少在某些视图中使用起来很容易(例如 www.domain.com/yourview/2010/03/)

    【讨论】:

    • 感谢您的帮助和对新手问题的抱歉,但是我将如何从每个客户端的视图中调用此方法,从那里将其传递回模板?再次感谢,希望这对其他 Django 新手有所帮助。
    • y, m = 2010, 10 个客户 = [] for c in Client.objects.all(): clients.append({'client':c, 'purchases':c.get_purchases_month(y , m)}) 然后您将clients 列表传递给您的模板并在那里循环遍历它。这不是很有效的方法,但很简单;-)
    【解决方案2】:
    y, m = 2010, 10
    clients = []
    for c in Client.objects.all():
      clients.append({'client':c, 'purchases':c.get_purchases_month(y, m)})
    

    然后您将clients 列表传递给您的模板并在那里循环遍历它。这不是很有效的方法,但很简单;-)

    {% for c in clients %}
      {{c.client.name}}
      {{c.purchases_month.purchase_sum}}
      {{c.purchases_month.all|length}}
    {% endfor %}
    

    purchases_month.all 因为它是一个查询集,您必须使用 all() 来获取项目,并使用 `|length' 来计算这些项目

    (不得不作为另一个答案,因为注释中的代码显然无法格式化)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-21
      • 2014-03-16
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多