Django中的嵌套SQL查询

Django中的嵌套SQL查询,django,django-queryset,Django,Django Queryset,我有一个正在工作的SQL查询,我正试图用Django编写它(不使用RAW),希望您能够提供帮助 大体上,我在看下面两个查询——第一个计算计数,然后我在看计数的平均值。(这将为您提供每个位置的票证上的平均项目数) 有效的SQL是: SELECT location_name, Avg(subq.num_tickets) FROM ( SELECT Count(ticketitem.id) AS num_tickets, location.name AS location_name

我有一个正在工作的SQL查询,我正试图用Django编写它(不使用RAW),希望您能够提供帮助

大体上,我在看下面两个查询——第一个计算计数,然后我在看计数的平均值。(这将为您提供每个位置的票证上的平均项目数)

有效的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')
#获取第一个计数
qs=ticketim.objects.filter()。\
值('ticket\u location\u app\u location\u name','posticket')\
注释(num_tickets=Count('id'))
#现在得到计数的平均值
qs2=qs.values('ticket\u location\u app\u location\u name')\
注释(平均('num_tickets'))\
订购人('位置\应用\位置\名称')

但这失败了,因为num_票不存在。。。不管怎样,我怀疑我太慢了。希望有人能启发我

查看有关从中聚合注释的部分。他们的示例取一个计数的平均值。

查看有关从中聚合注释的部分。他们的示例的平均值为一个计数。

我在manage.py shell中对此进行了一些研究,我认为django ORM可能无法进行这种注释。老实说,您可能不得不求助于执行一个原始查询或绑定一些类似的东西,这些东西可以让您通过SQLAlchemy来完成

当我玩这个的时候,我试过了

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

这给出了一个关于
FieldError:cannotcomputeavg('thing\uu count'):'thing\uu count'是一个聚合的
,这是有意义的,因为我怀疑ORM是否试图将第一个group by转换为嵌套查询。

我在manage.py shell中对此进行了一些研究,我认为django ORM可能无法进行这种注释。老实说,您可能不得不求助于执行一个原始查询或绑定一些类似的东西,这些东西可以让您通过SQLAlchemy来完成

当我玩这个的时候,我试过了

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

这给出了一个关于
字段错误:无法计算平均值('thing_ucount'):'thing_ucount'是一个聚合
,这很有意义,因为我怀疑ORM是否试图将第一个分组转换为嵌套查询。

您好,谢谢您的帮助。我尝试了这个示例,但它使用了“注释”和“聚合”,这给了我一个聚合结果,也就是说,这会给我一个总体平均值,但事实上我想要一个位置平均值——我假设我需要一个值/注释组合(基本上是一个群组)。你好,谢谢你的帮助。我试过这个例子,但它使用了“注释”和“聚合”,这给了我一个聚合结果,也就是说,这会给我一个总体平均值,但事实上我想要一个位置平均值——我假设我需要一个值/注释组合(基本上是一个分组)。