2013-07-27 8 views
6

過去30日間以内に作成されたモデルオブジェクトを毎日別々に数える高速メソッドを探しています。例:過去30日間に作成されたオブジェクトを取得する

27.07.2013 (today) - 3 objects created 
26.07.2013 - 0 objects created 
25.07.2013 - 2 objects created 
... 
27.06.2013 - 1 objects created 

このデータは、GoogleグラフAPIで使用します。このデータを効率的に入手する方法をお考えですか?

答えて

17
items = Foo.objects.filter(createdate__lte=datetime.datetime.today(), createdate__gt=datetime.datetime.today()-datetime.timedelta(days=30)).\ 
    values('createdate').annotate(count=Count('id')) 

これは、(1)フィルタ結果を過去30日間含有すること、(2)だけCREATEDATEフィールドを選択し、(3)選択されたすべてのフィールド(すなわちCREATEDATE)によってグループ化、IDをカウントします。これは、形式の辞書のリストを返します。

[ 
    {'createdate': <datetime.date object>, 'count': <int>}, 
    {'createdate': <datetime.date object>, 'count': <int>}, 
    ... 
] 

EDIT:

私はSQLで、でもそれらcount == 0と、すべての日付を取得する方法があります信じていません。欠落している日付をPythonコードで挿入する必要があります(例:

)。
import datetime 

# needed to use .append() later on 
items = list(items) 

dates = [x.get('createdate') for x in items] 

for d in (datetime.datetime.today() - datetime.timedelta(days=x) for x in range(0,30)): 
    if d not in dates: 
     items.append({'createdate': d, 'count': 0}) 
+0

私が探していたものです。しかし、私はまた、オブジェクトの数が等しい0の日付を含めることを望みます。どうすればいいですか? – dease

+0

@deaseその方法を反映するために私の答えを更新しました。また、元のコードをdatetimefieldsではなくdatefieldsを使用するように変更しました。 – knbk

+0

これ以降のご注文方法は? –

関連する問題