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の日付を含めることを望みます。どうすればいいですか? – dease
@deaseその方法を反映するために私の答えを更新しました。また、元のコードをdatetimefieldsではなくdatefieldsを使用するように変更しました。 – knbk
これ以降のご注文方法は? –