python - 返回按日期分组的列表的 QuerySet
问题描述
我的数据库中有一个交易模型,它存储我所有的银行交易并将它们显示在页面上。它们都列出了,但列表很长。为了缩短它,我想按月/年对它们进行分组,这样我就可以在页面上创建一个可折叠列表,其中除了当前月份之外的所有月份都已折叠。长时间的搜索只返回聚合和注释函数(我不完全理解)。我得到的最接近的是:
>>> 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
解决方案
一种解决方案是在视图中进行分组。
您可以在视图中迭代您的查询集,并将记录分配给每年/每月/无论如何的子列表;然后将这些子列表传递给您的模板进行渲染。
import collections
data = collections.defaultdict(list)
for t in Transaction.objects.all():
group = (t.date.year, t.date.month)
data[group].append(t)
在此代码片段中,变量data
是 a dict
,其键为年-月,Transaction
值的列表为(对应于该年和月)。
这样,如果您要呈现所有记录,就可以避免复杂的查询。
推荐阅读
- css - 如何在同一个类之间隐藏带有css的元素
- java - 如何覆盖数组?
- xml - 从元素中删除前缀
- javascript - javaScriptExecutor 返回的 Null
- xamarin - 使用带有 Xamarin Forms 4.0 Shell 的 IoC 容器来解析页面实例
- android - 如何在另一个 Activity 中显示数组列表?
- ruby - Jekyll 错误:nil:NilClass 的未定义方法祖先
- javascript - 网络抓取时的请求问题和欢呼
- php - 修改 request() 数组返回错误 间接修改重载属性
- angularjs - 具有隔离范围的 AngularJS 指令