0

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

任何信息,将不胜感激

4

2 回答 2

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/)

于 2010-04-02T14:22:13.677 回答
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' 来计算这些项目

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

于 2010-04-03T18:48:41.127 回答