Django:汇总按外键分组的记录值

时间:2010-04-02 10:20:31

标签: django django-templates django-views

在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注释,但无法理解如何在特定月份对特定组的字段值求和,并将信息作为变量/标记发送到模板。

任何信息都将不胜感激

2 个答案:

答案 0 :(得分:2)

您可以使用聚合而不是注释: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 /)

答案 1 :(得分:1)

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'来计算这些项目

(不得不另外给出答案,因为评论中的代码显然无法格式化)