2

只是想知道是否有可能获得仅使用 Django ORM 的 SQL 查询可以获得的结果:

SELECT * FROM (SELECT DATE_FORMAT(created, "%Y") as dte, sum(1) FROM some_table GROUP BY dte) as analytics;

结果是:

+------+--------+
| dte  | sum(1) |
+------+--------+
| 2006 |     20 | 
| 2007 |   2230 | 
| 2008 |   4929 | 
| 2009 |   1177 | 
+------+--------+

简化模型如下所示:

# some/models.py

class Table(models.Model):
   created = models.DateTimeField(default=datetime.datetime.now)

我已经尝试了各种混合使用 .extra(select={}) 和 .values() 的方法,还使用了此处描述的 .query.group_by 技巧但希望能以全新的眼光看待这个问题。

4

2 回答 2

3

Django 1.1(发布时的主干)具有聚合,这些允许您在查询中执行countsminssumsaverages等。

您想要做的可能会使用多个查询集来完成。请记住,表中的每一行(甚至是生成的结果表)都应该是一个新对象。你并没有真正解释你在总结什么,所以我会考虑一下dollars

book_years = Books.object.all().order_by('year').distinct()

# I use a list comprehension to filter out just the years
for year in [book_year.created.year for book_year in book_years]:
    sum_for_year = Book.objects.filter(created__year=year).aggregate(Sum(sales))
于 2009-06-01T03:44:09.373 回答
2

当您需要 Django 不允许您通过 ORM 表达的查询时,您始终可以使用原始 SQL

为了您的直接目的,我认为按表达式分组(并对组进行聚合计算)超出了 Django 当前的能力。

于 2009-06-01T03:53:40.963 回答