2012-05-25 2 views
1

ОК, так что у меня есть следующие модели:Джанго запрос группирования результат

Transaction 
    currency_code: CharField 
    date_time: DateTimeField 
    price:  IntegerField 

Я хотел бы сделать запрос, который возвращает словарь отдельных дней, с итогами для всех операций по каждому CURRENCY_CODE. Так что-то вроде:

{ 
    '2012/05/01': { 
    'USD': 5000, 
    'EUR': 3500, 
    } 
    '2012/05/02': { 
    'USD' ... 

До сих пор я получил этот запрос, но я вроде застрял:

Transaction.objects.extra({'date' : 'date(date_time)'}).values('date', 'currency_code').annotate(Sum('price')) 

Это заставляет меня результат, который выглядит следующим образом:

[ 
    {'date': datetime.date(2012, 5, 1), 'price__sum': 5000, 'currency_code': 'USD'} 
    {'date': datetime.date(2012, 5, 1), 'price__sum': 3500, 'currency_code': 'EUR'} 
    ... 
] 

Любые советы о том, как я могу получить свой запрос для группировки по дате? Заранее спасибо!

ответ

1

Вот не-ORM подход, чтобы получить вещи сделано:

>>> from collections import defaultdict 
>>> d = defaultdict(dict) 
>>> l = [{'a': 1, 'price': 50, 'currency': 'USD'},{'a': 1, 'price': 55, 'currency': 'USD'}, {'a': 1, 'price': 0, 'currency': 'USD'},{'a':1, 'price': 20, 'currency': 'EUR'}] 
>>> for i in l: 
...  if i['currency'] not in d[i['a']].keys(): 
...   d[i['a']][i['currency']] = i['price'] 
...  else: 
...   d[i['a']][i['currency']] += i['price'] 
... 
>>> d 
defaultdict(<type 'dict'>, {1: {'USD': 105, 'EUR': 20}}) 

Вот версия GroupBy:

>>> l2 = [] 
>>> for i,g in groupby(l, lambda x: x['currency']): 
...  price = 0.0 
...  for p in g: 
...  price += p['price'] 
...  l2.append({'a': p['a'], 'total' : price, 'currency': i}) 
... 
>>> l2 
[{'a': 1, 'currency': 'USD', 'total': 105.0}, {'a': 1, 'currency': 'EUR', 'total': 20.0}, {'a': 2, 'currency': 'KWD', 'total': 2.0}, {'a': 2, 'currency': 'GBP', 'total': 21.0}] 
+0

'от itertools импорта groupby' – DrTyrsa

+0

Проверить это для намека на GroupBy HTTP: //stackoverflow.com/questions/773/how-do-i-use-pythons-itertools-groupby – Mikael

Смежные вопросы