【问题标题】:Nested SQL queries in DjangoDjango 中的嵌套 SQL 查询
【发布时间】:2016-08-13 20:00:52
【问题描述】:

我有一个有效的 SQL 查询,我正在尝试用 Django 编写(不使用 RAW),希望您能提供帮助。

总的来说,我正在寻找接下来的两个查询 - 第一个计算 COUNT,然后我正在寻找计算 COUNTS 的 AVERAGE。 (这将为您提供每个位置票上的平均物品数量)

有效的 SQL 是:

SELECT location_name, Avg(subq.num_tickets) FROM (
    SELECT Count(ticketitem.id) AS num_tickets, location.name AS location_name 
    FROM ticketitem 
        JOIN ticket ON ticket.id = ticketitem.ticket_id
        JOIN location ON location.id = ticket.location_id
        JOIN location ON location.id = location.app_location_id
    GROUP BY ticket_id, location.name) AS subq
GROUP BY subq.location_name;

对于我的 Django 代码,我正在尝试这样的事情:

    # Get the first count
    qs = TicketItem.objects.filter(<my complicated filter>).\                 
    values('ticket__location__app_location__name','posticket').\
                                annotate(num_tickets=Count('id'))  
    # now get the average of the count
    qs2 = qs.values('ticket__location__app_location__name').\
    annotate(Avg('num_tickets')).\
    order_by('location__app_location__name')

但这失败了,因为 num_tickets 不存在......无论如何 - 怀疑我很慢。希望有人能启发我!

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    查看Django docs 中关于聚合注释的部分。他们的示例取平均数。

    【讨论】:

    • 您好-感谢您的帮助。我尝试了该示例,但它使用“annotate”然后“aggregate”,这给了我一个汇总结果,即这会给我一个平均的整体,但我实际上想要按位置进行平均 --- 我假设这样做我需要一个值/注释组合(本质上是一个 GROUP BY)。
    【解决方案2】:

    我在 manage.py shell 中玩过这个,我认为 django ORM 可能无法进行这种注释。老实说,您可能不得不求助于执行原始查询或绑定 https://github.com/Deepwalker/aldjemy 之类的东西,这可以让您通过 SQLAlchemy 做到这一点。

    当我玩这个时,我尝试过

    (my_model.objects.filter(...)
        .values('parent_id', 'parent__name', 'thing')
        .annotate(Count('thing'))
        .values('name', 'thing__count')
        .annotate(Avg('thing__count')))
    

    这给出了关于 FieldError: Cannot compute Avg('thing__count'): 'thing__count' is an aggregate 的可爱回溯,这是有道理的,因为我怀疑 ORM 是否正在尝试将第一个 group by 转换为嵌套查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-12
      • 1970-01-01
      • 2017-11-08
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      相关资源
      最近更新 更多