2010-03-18 3 views
1

J'ai une requête que j'essaie de comprendre la façon "django" de le faire: Je veux prendre les 100 derniers appels d'appel. Ce qui est facile: appels = Call.objects.all(). Order_by ('- call_time') [: 100]Requête Django: Compte et Groupe BY

Cependant la partie suivante je ne peux pas trouver le moyen de le faire via ORM de django. Je veux obtenir une liste des call_types et le nombre d'appels que chacun a dans le précédent queryset que j'ai fait. Normalement, je voudrais faire une requête comme celle-ci: "SELECT COUNT (id), calltype FROM appel WHERE id IN (SELECT ID FROM appel ORDER BY call_time DESC LIMIT 100) GROUP BY calltype;"

Je n'arrive pas à trouver la façon django de faire cette requête particulière.

Voici mes 2 modèles:

class Call(models.Model): 
    call_time = models.DateTimeField("Call Time", auto_now = False, auto_now_add = False) 
    description = models.CharField(max_length = 150) 
    response = models.CharField(max_length = 50) 
    event_num = models.CharField(max_length = 20) 
    report_num = models.CharField(max_length = 20) 
    address = models.CharField(max_length = 150) 
    zip_code = models.CharField(max_length = 10) 
    geom = models.PointField(srid=4326) 
    calltype = models.ForeignKey(CallType) 

    objects = models.GeoManager() 

class CallType(models.Model): 
    name = models.CharField(max_length = 50) 
    description = models.CharField(max_length = 150) 
    active = models.BooleanField() 
    time_init = models.DateTimeField("Date Added", auto_now = False, auto_now_add = True) 

    objects = models.Manager() 

Répondre

1

essayez ceci:

calls = Call.objects.all().order_by('-call_time')[:100] 
types = CallType.objects.filter(call__in=calls).annotate(Count('call')) 

vous pourriez avoir besoin d'ajouter distincte() à ce dernier queryset cependant.

+0

C'est exactement ce que je cherchais pour Dimitry. Merci beaucoup! –

0

Avec django 1.1.1 cette œuvre étonnamment ne marche pas;

from django.db.models import Count 
calls = Call.objects.all().order_by('-call_time')[:100] 
groups = calls.values('calltype').annotate(Count('calltype')) 

cela fonctionne mais retourne sur l'ensemble des objets, non seulement les 100 sélectionnés! Je ne peux pas comprendre.

mais cette solution pourrait aider (aujourd'hui les appels résumés groupés par CALLTYPE):

import datetime 
Call.objects.order_by('-call_time').filter(call_time__gte=datetime.datetime.today() - datetime.timedelta(days=1)).values('calltype').annotate(Count('calltype')) 
Questions connexes