返回按日期分组的列表的QuerySet

时间:2019-03-08 19:47:35

标签: python django

我的数据库中有一个交易模型,该模型存储了我所有的银行交易,并在页面上显示了它们。它们都列出了,但是列表很长。为了缩短时间,我想按月/年对它们进行分组,以便可以在页面上创建一个可折叠列表,其中除当月以外的所有月份均处于折叠状态。长搜索仅返回聚合和注释函数(我不完全了解)。我得到的最接近的是:

>>> data = Transaction.objects.annotate(month=TruncMonth('date')).values('month').annotate(c=Count('id')).values('month', 'c')
>>> data
<QuerySet [{'month': datetime.date(2016, 12, 1), 'c': 74}, {'month': datetime.date(2017, 1, 1), 'c': 109}, {'month': datetime.date(2017, 2, 1), 'c': 70}, {'month': datetime.date(2017, 3, 1), 'c': 92}, {'month': datetime.date(2017, 4, 1), 'c': 79}, {'month': datetime.date(2017, 5, 1), 'c': 79}, {'month': datetime.date(2017, 6, 1), 'c': 83}, {'month': datetime.date(2017, 7, 1), 'c': 99}, {'month': datetime.date(2017, 8, 1), 'c': 98}, {'month': datetime.date(2017, 9, 1), 'c': 112}, {'month': datetime.date(2017, 10, 1), 'c': 87}, {'month': datetime.date(2017, 11, 1), 'c': 82}, {'month': datetime.date(2017, 12, 1), 'c': 86}, {'month': datetime.date(2018, 1, 1), 'c': 113}, {'month': datetime.date(2018, 2, 1), 'c': 98}, {'month': datetime.date(2018, 3, 1), 'c': 121}, {'month': datetime.date(2018, 4, 1), 'c': 111}, {'month': datetime.date(2018, 5, 1), 'c': 107}, {'month': datetime.date(2018, 6, 1), 'c': 91}, {'month': datetime.date(2018, 7, 1), 'c': 97}, '...(remaining elements truncated)...']>

如您所见,这只是计算在同一月份/每年发生的交易。我实际上想列出所有交易。

这是我的交易模型:

class Transaction(models.Model):
   date = models.DateField(default=datetime.date.today)
   description = models.CharField(max_length=100)
   category = models.CharField(max_length=100)
   amount = models.DecimalField(max_digits=10, decimal_places=2)

   def __str__(self):
       return self.description

1 个答案:

答案 0 :(得分:1)

一种解决方案是在视图中进行分组。

您可以遍历视图中的查询集,然后按年/月/日等方式将记录分配给子列表;然后将这些子列表传递到模板进行渲染。

import collections

data = collections.defaultdict(list)
for t in Transaction.objects.all():
    group = (t.date.year, t.date.month)
    data[group].append(t)

在此代码段中,变量data是一个dict,以年月为键,并以Transaction列表(对应于该年和月)作为值。

这样,如果您仍然要呈现所有记录,则可以避免复杂的查询。