2016-04-20 70 views
0

我有一個正在嘗試在Django中編寫的SQL查詢(不訴諸於RAW),並希望您可以提供幫助。大致上,我期待接下來的兩個查詢 - 第一個計算COUNT,然後我計算一個COUNTER的平均值。 (這會給你一個大件商品的平均數,每個位置)Django中嵌套的SQL查詢

的作品是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

查看關於從Django docs彙總註釋的部分。他們的例子需要平均數。

+0

嗨那裏 - 謝謝你的幫助。我試過這個例子,但它使用「註釋」,然後「聚合」,這給了我一個聚合的結果,我..這會給我一個平均的整體,但我其實想要一個平均的位置---我假設我需要一個值/註釋組合(本質上是一個GROUP BY)。 – adamtay82

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正試圖通過以嵌套查詢轉換是第一組。