【问题标题】:Get total for each month using Django使用 Django 获取每个月的总计
【发布时间】:2011-08-21 01:50:50
【问题描述】:

我有一个这样的模型:

class Sales(models.Model):
    item = models.CharField(max_length=40)
    date_sold = models.DateTimeField()

我想展示一个特定年份每个月售出的总商品的条形图。我的图表软件需要一个像下面这样的列表,其中每个数字是特定月份销售的总商品。

sales_by_month = [4, 6, 7, 3, 5. ...]  

我该怎么做?

我觉得我应该使用日期,aggregate 和/或 annotate,但无法解决。

我正在使用 SQLite,但打算使用 PostgreSQL。

我在另一个项目中使用 ruby​​ on rails 做到了这一点,据我所知,它非常简单,所以我希望 Django 有一个好的解决方案。

【问题讨论】:

    标签: django django-models django-queryset


    【解决方案1】:

    通常对于这样的事情,下面的代码应该可以工作。

    Sales.objects.filter(date_sold__year='2010').values_list('month').annotate(total_item=Count('item'))
    

    但是您有一个 dateTime 字段,而不仅仅是每个项目的月份。您可以尝试执行以下操作,但我怀疑它会起作用。

    values_list('date_sold__month')
    

    另一种选择是尝试使用 extra(),如 thread 所示。因此,如果您使用的是 MySql,您可以尝试这样的事情。

    Sales.objects.filter(date_sold__year='2010').extra({'month' : "MONTH(date_sold)"}).values_list('month').annotate(total_item=Count('item'))
    

    【讨论】:

    • 我创建了一个新字段:date_sold_date = models.DateField()。我将它设置为 date_sold 的日期部分。但是,当我执行 values_list('date_sold_date__month') 时,它返回 Cannot resolve keyword 'not_after_date__month' 归档。仅 values_list('month') 也得到了同样的结果。看起来我错过了什么?
    • 你应该拥有的是 values_list('date_sold_date')
    • 谢谢。走得更远了。现在从 django 扩展 shell 运行时未定义计数。
    • 从 django.db.models 导入计数
    • 看起来不错!最后一个问题(我希望:-))我如何将每个月的总数放入列表中,例如 [1, 6, 7, 4, ...]
    【解决方案2】:

    使用django-qsstats-magic:

    import qsstats
    
    queryset = Sales.objects.filter(date_sold__year='2010')
    
    stats = qsstats.QuerySetStats(queryset, 'date_sold')
    
    start, end = date(2010, 1, 1), date(2011, 1, 1)
    sales_by_month = stats.time_series(start, end, interval='months')
    
    # sales_by_month is a list of 2-element tuples where the first element is
    # a datetime object and the second is value
    
    result = [r[1] for r in sales_by_month]
    

    【讨论】:

    • 谢谢。我也有兴趣看看它是如何使用标准捆绑的 Django 库来完成的。
    猜你喜欢
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多