Django中的嵌套SQL查询

时间:2016-04-20 21:38:41

标签: django django-queryset

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

从广义上讲,我正在寻找接下来的两个查询 - 第一个计算COUNT,然后我想要计算一个COUNER的平均值。 (这会给你一张票,每个地点的平均物品数量)

有效的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不存在而失败......无论如何 - 怀疑我很慢。会爱一个人来启发我!

2 个答案:

答案 0 :(得分:0)

查看有关汇总Django docs注释的部分。他们的例子平均需要一个计数。

答案 1 :(得分:0)

我在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正在尝试将第一个组转换为嵌套查询。