В Django есть некоторые функции OLAP, которые близки к выпуску.
Чтение http://www.eflorenzano.com/blog/post/secrets-django-orm/
http://doughellmann.com/2007/12/30/using-raw-sql-in-django.html, также
Если у вас в первую очередь правильный дизайн схемы звезды, тогда одномерные результаты могут иметь следующий вид.
from myapp.models import SomeFact
from collections import defaultdict
facts = SomeFact.objects.filter( dimension1__attribute=this, dimension2__attribute=that )
myAggregates = defaultdict( int )
for row in facts:
myAggregates[row.dimension3__attribute] += row.someMeasure
Если вы хотите создать двумерную сводку, вам нужно сделать что-то вроде следующего.
facts = SomeFact.objects.filter( dimension1__attribute=this, dimension2__attribute=that )
myAggregates = defaultdict( int )
for row in facts:
key = ( row.dimension3__attribute, row.dimension4__attribute )
myAggregates[key] += row.someMeasure
Чтобы вычислить несколько СУММ и СЧЕТОВ, а что нет, вы должны сделать что-то вроде этого.
class MyAgg( object ):
def __init__( self ):
self.count = 0
self.thisSum= 0
self.thatSum= 0
myAggregates= defaultdict( MyAgg )
for row in facts:
myAggregates[row.dimension3__attr].count += 1
myAggregates[row.dimension3__attr].thisSum += row.this
myAggregates[row.dimension3__attr].thatSum += row.that
Это - на первый взгляд - кажется неэффективным. Вы просматриваете таблицу фактов, возвращая множество строк, которые затем агрегируете в своем приложении.
В некоторых случаях это может быть быстрее , чем собственная сумма СУБД / group_by. Зачем? Вы используете простое отображение, а не более сложную операцию группировки на основе сортировки, которую СУБД часто приходится использовать для этого. Да, вы получаете много строк; но вы делаете меньше, чтобы получить их.
Это имеет тот недостаток, что это не так декларативно, как хотелось бы. Преимущество в том, что это чистый Django ORM.