HighCharts在Jinja2 Temp中呈现带注释的查询集

2024-03-29 09:25:30 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的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

我被困在这一点,并寻找一个性能的方法来应用检索到的数据到我的模板。你知道如何在不多次查询数据库的情况下,将行划分为类别/在结果上循环吗?你知道吗


我的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 ^{},它在这个场景中可能很有用。在接下来的几天里,我将尝试更深入地研究这个问题,因为我目前正在从事一个不同的项目。


Tags: testdatemodeltitlemodelslengthmaxclass
1条回答
网友
1楼 · 发布于 2024-03-29 09:25:30

如前所述:^{} template tag是选择的工具。别忘了queryset必须订购。你知道吗

{% 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 %}

相关问题 更多 >