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)計數的ID,由所有選定字段(即CREATEDATE)分組。這將返回格式的詞典列表:
[
{'createdate': <datetime.date object>, 'count': <int>},
{'createdate': <datetime.date object>, 'count': <int>},
...
]
編輯:
我不相信有辦法讓所有的日期,甚至包括那些count == 0
,只有SQL。你必須通過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我更新了我的答案,以反映如何做到這一點。我還將原始代碼更改爲使用datefields而不是datetimefields。 – knbk
以後如何訂購? –