HighCharts 在 Jinja2 模板中呈现带注释的查询集
HighCharts Render Annotated Queryset in Jinja2 Template
在我的 Jinja2
模板中,我想渲染一个 JavaScript
类似于这样的数组:
[{
name: 'test',
data: [
[Date.UTC(1970, 9, 29), 0],
[Date.UTC(1970, 10, 9), 0.4],
...
]
},
{
name: 'Transport',
data: [
[Date.UTC(1970, 10, 25), 0],
...
]
}]
我已经设法在我的 Django
代码中构建了一个相当 复杂的 查询集。看起来像下面这样:
(Category.objects.filter(expense__period=p)
.annotate(day=Trunc('expense__date', 'day'))
.values('title', 'day')
.order_by('title', 'day')
.annotate(Sum('expense__amount'), Count('id')))
这导致:
TITLE DAY EXPENSE__AMOUNT__SUM ID__COUNT
test 2017-12-30 00:00:00+00:00 10.00 1
test 2018-01-08 00:00:00+00:00 2.70 1
test 2018-01-09 00:00:00+00:00 62.00 2
Transport 2018-01-03 00:00:00+00:00 111.00 1
Transport 2018-01-09 00:00:00+00:00 15.00 1
Transport 2018-01-10 00:00:00+00:00 12.00 1
我被困在这一点上并寻找一种高效的方式将检索到的数据应用到我的模板中。知道如何在不多次查询数据库的情况下将结果的行分成 categories/loop 吗?
我的models.py
是:
class Period(models.Model):
title = models.CharField(max_length=100)
slug = AutoSlugField(populate_from='title')
class Category(models.Model):
title = models.CharField(max_length=100)
class Expense(models.Model):
period = models.ForeignKey(Period, on_delete=models.CASCADE, null=True)
date = models.DateField(default=date.today)
title = models.CharField(max_length=100)
category = models.ForeignKey(Category, null=True)
amount = MoneyField(max_digits=10, decimal_places=2, default_currency='EUR')
编辑:
我偶然发现了 default template tag regroup
在这种情况下可能很有用。 在接下来的几天里,我将尝试更深入地研究这个问题,因为我目前正在处理不同的项目。
如前所述:regroup
template tag 是首选工具。不要忘记必须对查询集进行排序。
{% regroup queryset by title as categories %}
{% for category in categories %}
{
name: '{{ category.grouper }}',
data: [
{% for expense in category.list %}
[{% widthratio expense.day|date:"U" 1 1000 %}, {{ expense.expense__amount__sum }}],
{% endfor %}
]
},
{% endfor %}
在我的 Jinja2
模板中,我想渲染一个 JavaScript
类似于这样的数组:
[{
name: 'test',
data: [
[Date.UTC(1970, 9, 29), 0],
[Date.UTC(1970, 10, 9), 0.4],
...
]
},
{
name: 'Transport',
data: [
[Date.UTC(1970, 10, 25), 0],
...
]
}]
我已经设法在我的 Django
代码中构建了一个相当 复杂的 查询集。看起来像下面这样:
(Category.objects.filter(expense__period=p)
.annotate(day=Trunc('expense__date', 'day'))
.values('title', 'day')
.order_by('title', 'day')
.annotate(Sum('expense__amount'), Count('id')))
这导致:
TITLE DAY EXPENSE__AMOUNT__SUM ID__COUNT
test 2017-12-30 00:00:00+00:00 10.00 1
test 2018-01-08 00:00:00+00:00 2.70 1
test 2018-01-09 00:00:00+00:00 62.00 2
Transport 2018-01-03 00:00:00+00:00 111.00 1
Transport 2018-01-09 00:00:00+00:00 15.00 1
Transport 2018-01-10 00:00:00+00:00 12.00 1
我被困在这一点上并寻找一种高效的方式将检索到的数据应用到我的模板中。知道如何在不多次查询数据库的情况下将结果的行分成 categories/loop 吗?
我的models.py
是:
class Period(models.Model):
title = models.CharField(max_length=100)
slug = AutoSlugField(populate_from='title')
class Category(models.Model):
title = models.CharField(max_length=100)
class Expense(models.Model):
period = models.ForeignKey(Period, on_delete=models.CASCADE, null=True)
date = models.DateField(default=date.today)
title = models.CharField(max_length=100)
category = models.ForeignKey(Category, null=True)
amount = MoneyField(max_digits=10, decimal_places=2, default_currency='EUR')
编辑:
我偶然发现了 default template tag regroup
在这种情况下可能很有用。 在接下来的几天里,我将尝试更深入地研究这个问题,因为我目前正在处理不同的项目。
如前所述:regroup
template tag 是首选工具。不要忘记必须对查询集进行排序。
{% regroup queryset by title as categories %}
{% for category in categories %}
{
name: '{{ category.grouper }}',
data: [
{% for expense in category.list %}
[{% widthratio expense.day|date:"U" 1 1000 %}, {{ expense.expense__amount__sum }}],
{% endfor %}
]
},
{% endfor %}