Django每月附加价格

2021-05-13 14:47:47 发布

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

我想把这个引用到我的另一个Question这里,所以我试图显示每个月的价格,并制作一个有12个月的表,一行包含每月的项目总收入,所以我已经成功地使用

context["price_aux"] = Project.objects.annotate().aggregate(Sum("price_aux"))

我可以在一个表中显示我的数据,并为此生成一行total,但是正如您从我前面的问题中看到的那样,我想每月对这个进行注释,并创建一个表,然后显示月份的total,但是我很难理解如何从数据库中提取这些数据,那么在django==1.8+中执行此操作的正确方法是什么在最近的版本中,他们添加了Extract,但是我不能在1.8中使用它,第二件事是django extra,他们在这里声明了{a3},所以你能解释一下我怎样才能做到这一点吗。在

2条回答
网友
1楼 ·

我的建议是在模型中添加一个字段,因为不可能在.values_list中使用__month。“值”列表可用于在注释之前对查询进行分组。在

场可能是这样的。在

year_month = models.CharField(index=True)

您可以覆盖模型上的save方法并执行以下操作

^{pr2}$

现在可以给你的价格加上注解。在

Project.objects.values_list('year_month').annotate(price_sum=Sum("price_aux"))

如果你需要更多的信息,我相信你可以扩大价值清单。在

Project.objects.values_list('year_month').annotate(price_sum=Sum("price_aux")) \
    .values_list('name', 'year_month', 'price_sum')

当然,不添加字段也可以这样做。假设你想要过去的一年。在

import datetime
from django.utils import timezone

def my_list_view(request):
    end = timezone.now()
    # note, could do some weird stuff in years with 366 days
    begin = (end - datetime.timedelta(days=365)).replace(day=1)  

    container = {}
    while begin < end:
        container[begin.strftime("%Y%m")] = 0
        begin = (begin + datetime.timedelta(weeks=5).replace(day=1)

    for project in Project.objects.iterator():
        container[project.created_at.strftime("%Y%m")] += price

    # Now you can render your template
网友
2楼 ·

假设您的模型名为Prices,有两个字段date和{},其中{}是日期时间字段。然后您可以使用date__month(注意双下划线)作为查询方法的关键字参数(请参阅field lookups的文档)。在

您可以通过

Prices.objects.get(date__month=1).price

相关问题