使用 Django 获取每个月的总计

发布于 2024-11-05 21:48:01 字数 458 浏览 1 评论 0原文

我有一个这样的模型:

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

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

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

我该怎么做?

我有一种感觉,我应该使用日期、聚合和/或注释,但无法解决。

我正在使用 SQLite,但计划使用 PostgreSQL。

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

I have a model like this:

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

I'd like to present a bar chart of total items sold each month for a particular year. My charting software expects a list like the one below where each number is the total items sold for a particular month.

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

How would I do this?

I've got a feeling I should be using dates, aggregate and/or annotate, but can't work it out.

I'm using SQLite, but plan to go to PostgreSQL.

I did this in another project using ruby on rails and it was pretty straightforward as far as I remember, so I'm hoping Django has a good solution.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

奢华的一滴泪 2024-11-12 21:48:01

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

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

但是您有一个日期时间字段,而不仅仅是每个项目的月份。您可以尝试执行以下操作,尽管我怀疑它是否有效。

values_list('date_sold__month')

另一种选择是尝试使用 extra() ,如该 线程所示。因此,如果您使用 MySql,您可以尝试类似的操作。

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

Usually for something like this the code below should work.

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

But you have a dateTime field, and not just the month for each item. You could try doing the following, though I doubt it will work.

values_list('date_sold__month')

The other option would be to try using extra() as shown in this thread. You could therefore try something like this if you are using MySql.

Sales.objects.filter(date_sold__year='2010').extra({'month' : "MONTH(date_sold)"}).values_list('month').annotate(total_item=Count('item'))
一桥轻雨一伞开 2024-11-12 21:48:01

使用 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]

using 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]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文