Django每月注释价格

时间:2017-02-13 08:03:06

标签: python mysql django

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

成功计算了我的价格

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

我可以在一个表格中显示我的数据,然后只为它做一行,但正如你从我之前的问题中看到的那样,我想每月注释一次并制作一个表格,然后显示月份的总数,但是我我真的很难理解如何从我的数据库中提取这个,所以在django==1.8+中执行此操作的正确方法是什么,我看到在最近的版本中他们添加了Extract,但我无法使用它在1.8中,第二件事是django extra他们在这里说Use this method as a last resort,所以你能解释我怎样才能做到这一点。

2 个答案:

答案 0 :(得分:1)

我的建议是您在模型中添加字段,因为在__month中无法使用.values_list。 Values_list可用于在注释之前对查询进行分组。

字段可能类似于。

year_month = models.CharField(index=True)

您可以覆盖模型上的保存方法并执行类似

的操作
def save(self, *args, **kwargs)
    # Not sure if auto_add_now already set the value, could use timezone.now()
    if not self.id:  # thus not saved yet
        self.year_month = self.created_at.strftime("%Y%m")
    super(Model, self).save(*args, **kwargs)

现在可以注释您的价格。

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

如果您需要更多信息,我相信您可以扩展values_list。

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

答案 1 :(得分:0)

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

您可以通过

按月检索价格
Prices.objects.get(date__month=1).price