1

OK、それで私は次のモデルを持っています:

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'}
  ...
]

クエリを日付でグループ化する方法について何かアドバイスはありますか?前もって感謝します!

4

1 に答える 1

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}]
于 2012-05-25T04:47:19.897 に答える