在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注释,但无法理解如何在特定月份对特定组的字段值求和,并将信息作为变量/标记发送到模板。
任何信息都将不胜感激
答案 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'来计算这些项目
(不得不另外给出答案,因为评论中的代码显然无法格式化)