После поиска в django-запросе api doc я не нашел способа сделать запрос через систему django ORM. Курсор - это обходной путь, если бренд вашей базы данных MySQL:
from django.db import connection, transaction
cursor = connection.cursor()
cursor.execute("""
select
week(time) as `week`,
count(*) as `count`
from EventOccurrence
group by week(time)
order by 1;""")
myData = dictfetchall(cursor)
Это, на мой взгляд, лучшее решение для повышения производительности.Но обратите внимание, что это не дополняет пропущенные недели.
EDITED Независимое решение для бренда базы данных с помощью Python (меньшая производительность)
Если вы ищете код независимости бренда для базы данных, то вы должны брать даты изо дня в день и агрегировать их черезпитон.Если это ваш код дела, может выглядеть так:
#get all weeks:
import datetime
weeks = set()
d7 = datetime.timedelta( days = 7)
iterDay = datetime.date(2012,1,1)
while iterDay <= datetime.now():
weeks.add( iterDay.isocalendar()[1] )
iterDay += d7
#get all events
allEvents = EventOccurrence.objects.value_list( 'time', flat=True )
#aggregate event by week
result = dict()
for w in weeks:
result.setdefault( w ,0)
for e in allEvents:
result[ e.isocalendar()[1] ] += 1
(Отказ от ответственности: не тестировался)