我有一个正在尝试在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不存在而失败......无论如何 - 怀疑我很慢。会爱一个人来启发我!
答案 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正在尝试将第一个组转换为嵌套查询。