2010-11-29 16 views
0

En utilisant Django, je souhaite générer un jeu de requête avec des statistiques journalières en agrégeant à partir d'une table avec plusieurs entrées par jour. Voici la tableAgrégation de données dans une seule table avec Django

CREATE TABLE weather 
(
    id serial NOT NULL, 
    air_temp double precision NOT NULL, 
    obs_date date, 
    .... 
) 

Ceci est l'équivalent SQL du résultat que je veux obtenir ce dans le queryset

select obs_date, avg(air_temp) from weather group by obs_date order by obs_date 

Le modèle Django ressemble à ceci

class WeatherData(models.Model): 

    obs_date = models.DateField('Obs Date', blank=False, null=False, db_index=True) 
    air_temp = models.FloatField('Air Temp', blank=False, null=False) 
    ... 

J'ai lu ce http://docs.djangoproject.com/en/dev/topics/db/aggregation/ mais ne peut pas voir comment le faire. Suggestions appréciées.

Mise à jour: cela fonctionne:

WeatherData.objects.values('obs_date').annotate(max_air=Max('air_temp'), min_air=Min('air_temp')) 

Répondre

0
somedata = WeatherData.objects.annotate(Avg('air_temp')).order_by('obs_date') 
for datum in somedata: 
    print '%s: %s' % (datum.obs_date, datum.air_temp__avg) 
+0

Cela ne fonctionne pas, mais il m'a mis sur la bonne voie. Là où cela ne va pas, tous les champs de la table se retrouvent dans le GROUP BY généré par Django. Si vous insérez .values ​​() avant l'annotation, vous obtenez le bon résultat –