Запрос Django: количество и группа BY - PullRequest
1 голос
/ 18 марта 2010

У меня есть запрос, который я пытаюсь выяснить, как это делает "django": Я хочу принять последние 100 звонков от Call. Что легко: Call = Call.objects.all (). order_by ('- call_time') [: 100]

Однако в следующей части я не могу найти способ сделать это с помощью ORM django. Я хочу получить список call_types и количество вызовов, которые каждый из них имеет в рамках предыдущего набора запросов, который я только что сделал. Обычно я выполняю запрос, подобный следующему: «SELECT COUNT (id), тип вызова FROM из вызова WHERE ID IN (идентификатор SELECT из вызова ORDER BY call_time DESC LIMIT 100) GROUP BY calltype;»

Кажется, я не могу найти способ выполнения этого конкретного запроса с помощью django.

Вот мои 2 модели:

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()

Ответы [ 2 ]

1 голос
/ 20 марта 2010

попробуйте это:

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

вам может понадобиться добавить Different () к последнему набору запросов.

0 голосов
/ 18 марта 2010

С django 1.1.1 это удивительно не работает;

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

это работает, но возвращает все объекты, а не только 100 выбранных! не могу понять.

но этот обходной путь может помочь (сегодня сводка вызовов сгруппирована по типу вызова):

import datetime
Call.objects.order_by('-call_time').filter(call_time__gte=datetime.datetime.today() - datetime.timedelta(days=1)).values('calltype').annotate(Count('calltype'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...