【发布时间】:2014-11-24 12:32:31
【问题描述】:
这看起来像一个简单的问题,但我无法获得预期的结果。我有一张这样的桌子:
| id# | Concept | Amount | Date |
| ... | ... | 10 | 10/12/2013 |
| ... | ... | 20 | 12/12/2013 |
| ... | ... | 30 | 02/01/2014 |
| ... | ... | 40 | 03/01/2014 |
| ... | ... | 50 | 04/02/2014 |
| ... | ... | 60 | 05/02/2014 |
我想找到一种方法来使用此表获取 QuerySet:
| Date.year | Amount |
| 2013 | 30 |
| 2014 | 180 |
我想我可以通过类似的方式获得,例如:
| Date.month | Amount |
| 12/2013 | 30 |
| 01/2014 | 70 |
| 02/2014 | 110 |
有什么想法吗?
编辑
我会尽力澄清,对于任何误解或不好的解释,我深表歉意:-/
我有这个模型:
from django.db import models
from django.core.urlresolvers import reverse
class Expense(models.Model):
concept = models.CharField(max_length=255)
date = models.DateField()
amount = models.DecimalField(max_digits=7,decimal_places=2)
class Meta:
ordering = ['date']
def __unicode__(self):
return '%s' % (self.concept)
def get_absolute_url(self):
我有这个模板:
...
<table>
{% for year in years %}
<tr>
<td width="40%">
{{ year.year }}
</td>
<td width="60%" align="right">{{ year.total_amount }}</td>
</tr>
{% endfor %}
</table>
...
我正在尝试为我的view 找到一个查询集:
def index(request):
years = Expense.objects.values('date').annotate(total_amount=Sum('amount'))
return render(request, 'account/index.html', {'years': years})
在这种情况下,years 正在返回与我想要的“接近”的东西,因为它按日期对 expenses 进行分组,但我想按月或年对它们进行分组,而不是按“日”分组。
我不知道最好的方法是什么,查询费用或在模板中,或其他方式。这就是我需要的。我希望现在更清楚一点。
【问题讨论】:
-
Django 使用 ORM,你不能自己执行 SQL 命令。您需要有一个模型,该模型的字段映射到数据库中表的字段(理想情况下,您让 django 基于这些模型创建数据库)。然后,您可以使用模型并将行作为对象获取。那么你在这里遇到什么麻烦?配置模型或获取它们还是什么?你学过 Django 教程吗?
-
我有模型“费用”及其属性,它看起来像第一个表。我可以按天(日期)对它进行排序:
years = Expense.objects.values('date').annotate(total_amount=Sum('amount'));但不是在view上按月份或年份(在template上显示) -
@AKX 是的,我见过这个,但它与我的情况有点不同。我不知道我怎样才能适应我的。 PO 有一个
Group和Items,其中有一个日期。所以他有点转发。我试图根据我的情况调整解决方案,但在尝试时遇到了一些错误:( -
假设你的模型是
MyModel,MyModel.objects.all().extra(select={'year': "EXTRACT(year FROM date)"}).values('year').annotate(amount=Sum('amount'))不就行了吗?
标签: python sql django date group-by