【问题标题】:Django - ORM questionDjango - ORM 问题
【发布时间】:2009-06-01 03:19:16
【问题描述】:

只是想知道是否有可能获得仅使用 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() 以及使用 here 描述的 .query.group_by 技巧,但希望能以新的眼光看待这个问题。

【问题讨论】:

    标签: django orm date group-by


    【解决方案1】:

    Django 1.1(发布时的主干)具有aggregates,这些允许您在查询中执行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))
    

    【讨论】:

    • 再次,我很清楚 Django 在最新版本中的聚合功能。您能否尝试构建这样的查询来完成我提供的原始 SQL 的功能? :)
    【解决方案2】:

    当你需要一个 Django 不允许你通过 ORM 表达的查询时,你总是可以use raw SQL

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

    【讨论】:

    • 是的,我很清楚我可以执行原始 SQL,但问题是我是否可以使用 ORM 本身的当前功能来执行此操作。
    • 我很想学习其他方法,但我认为目前的答案是“不”。
    猜你喜欢
    • 2015-07-13
    • 1970-01-01
    • 2017-09-18
    • 2018-02-13
    • 2019-07-05
    • 2017-04-29
    • 1970-01-01
    • 2023-02-24
    • 2013-11-08
    相关资源
    最近更新 更多