我有这样一个简单的模型:

class Order(models.Model):
    created = model.DateTimeField(auto_now_add=True)
    total = models.IntegerField() # monetary value

我想逐月输出以下数据:

  • 一个月的销售量是多少(COUNT)
  • 合并值(SUM)

我不确定最好的攻击方式是什么.我见过一些看起来相当可怕的额外 Select 查询,但我简单的头脑告诉我,我最好只是迭代数字,从任意的年/月开始,一直计数到当前月份,抛出针对该月的简单查询过滤.更多的数据库工作-更少的开发人员压力!

什么对你来说最有意义?有没有什么好办法可以让我快速调出一张数据表?或者我的肮脏方法可能是最好的主意?

我用的是Django 1.3.不确定他们最近是否以更好的方式增加了GROUP_BY.

推荐答案

Django 1.10 and above

Django文档将extra列为deprecated soon.(感谢您指出@seddonym,@Lucas03).我开了一个ticket,这是Jarshwah提供的解决方案.

from django.db.models.functions import TruncMonth
from django.db.models import Count

Sales.objects
    .annotate(month=TruncMonth('created'))  # Truncate to month and add to select list
    .values('month')                          # Group By month
    .annotate(c=Count('id'))                  # Select the count of the grouping
    .values('month', 'c')                     # (might be redundant, haven't tested) select month and count 

Older versions

from django.db import connection
from django.db.models import Sum, Count

truncate_date = connection.ops.date_trunc_sql('month', 'created')
qs = Order.objects.extra({'month':truncate_date})
report = qs.values('month').annotate(Sum('total'), Count('pk')).order_by('month')

Edits

  • 增加计数
  • 为django添加的信息>;=1.10

Django相关问答推荐

Django中有修改字段值的挂钩吗?

Django-将html数据保存到quillfield中

在模板中自动添加变量

Django REST序列化程序TO_REATION失败

Templatetag 在 Django 4.2 模板 IF 条件中不起作用

我如何获得已循环的每个项目的名称?

Django 相当于子查询

如何在视图中的 Django 重定向末尾附加字符串?

int_list_validator在 Django 表单中不起作用

如何连接到 docker 容器中的 postgres 数据库?

根据模型属性获取django对象id

无效的命令 WSGIDaemonProcess 在 CentOS 6.7 上部署 Django 应用程序

Django 向用户推送 HTTP 响应

如何在 Django Rest Framework SimpleRouter 上使斜杠可选

如何使用 django-nose 运行单个测试或单个 TestCase?

如何在 django 中分离我的模型?

如何查询名称包含python列表中任何单词的模型?

Django 发送邮箱

django 如何知道已经运行了哪些迁移?

Django中'related_name'和'related_query_name'属性之间的区别?