2016-04-20 12 views
0

Ich habe eine funktionierende SQL-Abfrage, die ich in Django zu schreiben bin versucht (ohne zu RAW zurückgreifen) und hatte gehofft, Sie könnten helfen können.Verschachtelte SQL-Abfragen in Django

Im Großen und Ganzen, ich suche zur nächsten zwei Abfragen - der erste, COUNT berechnet, und dann suche ich ein Mittel der Zählungen zu berechnen. (Dies gebe Ihnen die durchschnittliche Anzahl der Elemente auf einem Ticket, pro Standort)

Die SQL, das funktioniert ist:

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; 

Für meine Django-Code, ich versuche, so etwas wie dieses:

aber das scheitert, weil num_tickets nicht existiert ... Wie auch immer - ich vermute, dass ich langsam bin. Würde jemanden lieben, um mich aufzuklären!

Antwort

0

Überprüfen Sie den Abschnitt aus auf Anmerkungen aus dem Django docs aggregieren. Ihr Beispiel nimmt einen Durchschnitt einer Zählung.

+0

Hallo zusammen - danke für Ihre Hilfe. Ich habe dieses Beispiel versucht, aber es verwendet "annotieren" und dann "aggregieren", was mir ein aggregiertes Ergebnis gibt, das würde mir insgesamt einen Durchschnitt geben, aber ich will tatsächlich ein Durchschnitt nach Ort --- Ich nahm an, dass ich eine Werte/Annotate Combo (im Wesentlichen eine GROUP BY) brauche. – adamtay82

0

Ich war mit diesem ein wenig in einer manage.py Schale herum spielen, und ich denke, die django ORM nicht in der Lage sein könnte, diese Art von Anmerkung zu tun. Ehrlich gesagt sind Sie wahrscheinlich zu haben, um dabei eine rohe Abfrage oder binden in so etwas wie https://github.com/Deepwalker/aldjemy zurückgreifen, die Sie würden tun lassen, dass über SQLAlchemy.

Als ich mit diesen zu spielen habe ich versucht,

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

Welche über FieldError: Cannot compute Avg('thing__count'): 'thing__count' is an aggregate, eine schöne Zurückverfolgungs gab was Sinn macht, da ich die ORM Zweifel durch zu einer verschachtelten Abfrage dieser erste Gruppe umwandeln will.

Verwandte Themen