2009-06-01 10 views
2

Je me demandais s'il est possible d'obtenir un résultat que je peux obtenir l'aide de cette requête SQL avec seulement Django ORM:Django - ORM question

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

Le résultat est:

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

La simplifiée modèle ressemble à ceci:

# some/models.py 

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

J'ai essayé différentes façons en utilisant mélange de .extra (select = {}) et .values ​​() et aussi en utilisant la .query.group_by astuce décrit here mais apprécierait un regard neuf sur le problème.

Répondre

3

Django 1.1 (tronc au moment de l'affichage de cette) a aggregates, ceux-ci vous permettent d'effectuer counts, mins, sums, averages, etc. dans vos requêtes.

Ce que vous cherchez à faire serait probablement accompli en utilisant plusieurs jeux de requête. N'oubliez pas que chaque ligne d'une table (même une table de résultats générée) est supposée être un nouvel objet. Vous n'explique pas vraiment ce que vous somme donc je considère 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)) 
+0

Encore une fois, je suis bien conscient des capacités d'agrégation de Django dans la dernière version. Pourriez-vous essayer de construire une telle requête qui fait ce que le SQL brut que j'ai fourni fait? :) –

2

Lorsque vous avez besoin d'une requête que Django ne vous laissez pas exprimer par l'ORM, vous pouvez toujours use raw SQL. Pour votre but immédiat, je pense que grouper par une expression (et faire un calcul agrégé sur le groupe) est au-delà des capacités actuelles de Django.

+0

Oui, je suis bien conscient que je peux faire du SQL brut, la question était que je peux le faire avec les capacités actuelles de ORM lui-même. –

+0

J'aimerais apprendre autrement, mais je pense que la réponse pour le moment est «non». –