2 Stimmen

Django - ORM Frage

Ich frage mich nur, ob es möglich ist, ein Ergebnis zu erhalten, das ich mit dieser SQL-Abfrage mit nur Django ORM erhalten kann:

SELECT * FROM (SELECT DATE_FORMAT(created, "%Y") as dte, sum(1) FROM some_table GROUP BY dte) as analytics;

Das Ergebnis ist:

+------+--------+
| dte  | sum(1) |
+------+--------+
| 2006 |     20 | 
| 2007 |   2230 | 
| 2008 |   4929 | 
| 2009 |   1177 | 
+------+--------+

Das vereinfachte Modell sieht wie folgt aus:

# some/models.py

class Table(models.Model):
   created = models.DateTimeField(default=datetime.datetime.now)

Ich habe versucht, verschiedene Möglichkeiten mit Mischung aus .extra(select={}) und .values() und auch mit der .query.group_by Trick beschrieben aquí würde aber einen neuen Blick auf das Problem begrüßen.

3voto

Soviut Punkte 83233

Django 1.1 (Stammversion zum Zeitpunkt der Veröffentlichung dieses Artikels) hat Aggregate können Sie Folgendes durchführen zählt , Minuten , Beträge , Durchschnittswerte usw. in Ihren Abfragen.

Was Sie vorhaben, lässt sich wahrscheinlich mit mehreren Abfragesätzen bewerkstelligen. Denken Sie daran, dass jede Zeile in einer Tabelle (auch in einer generierten Ergebnistabelle) ein neues Objekt sein sollte. Du erklärst nicht wirklich, was du summieren willst, also werde ich es in Betracht ziehen dollars :

book_years = Books.object.all().order_by('year').distinct()

# I use a list comprehension to filter out just the years
for year in [book_year.created.year for book_year in book_years]:
    sum_for_year = Book.objects.filter(created__year=year).aggregate(Sum(sales))

2voto

Dave W. Smith Punkte 23003

Wenn Sie eine Abfrage benötigen, die Sie mit Django nicht über den ORM ausdrücken können, können Sie jederzeit Raw SQL verwenden .

Für Ihren unmittelbaren Zweck, ich denke, dass Gruppierung durch einen Ausdruck (und tun eine Aggregat-Berechnung auf die Gruppe) ist jenseits der aktuellen Fähigkeiten von Django.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X