Django获取每月一个月中的对象数

时间:2019-02-10 19:54:32

标签: python django

我试图使用以下视图来获取一个月的每一天的对象数:

startIng = datetime.datetime(2019,1,1)
endIng = datetime.datetime(2019,2,1)
aDayDelta = timedelta(days=1)
totalDays = (endIng - startIng).days
days = [startIng + k*aDayDelta for k in range(totalDays)] 
for mydays in days:
    datem = Daily_movements.objects.filter(mov_date__startswith=(mydays))
...

但我什么也没得到

尝试:

datem = Daily_movements.objects.filter(mov_date__startswith=datetime.datetime(2019, 2, 9, 0, 0))

在给定的日期我得到了完美的结果

TIA寻求帮助

1 个答案:

答案 0 :(得分:0)

您可以过滤年份和月份,然后每天获取Count,例如:

from django.db.models import Count
from django.db.models.functions import ExtractDay

qs = Daily_movements.objects.filter(
    mov_date__year=year,
    mov_date__month=month
).annotate(
    day=ExtractDay('mov_date'),
).values(
    'day'
).annotate(
    n=Count('pk')
).order_by('day')

这将导致QuerySet用两个项目包装字典:'day'(表示日期)和n(表示值)。例如:

<QuerySet [
   { 'day': 1, 'n': 12 },
   { 'day': 3, 'n': 13 },
   { 'day': 4, 'n': 2 },
   { 'day': 6, 'n': 14 },
   { 'day': 10, 'n': 25 }
]>

然后我们可以将其转换为Counter,例如:对于未知键,默认为零的字典,例如:

from collections import Counter

data = Counter({d['day']: d['n'] for d in qs})

我们可以使用以下方法将其转换为列表:

from calendar import monthrange

__, ds = monthrange(year, month)
result = [data[i] for i in range(1, ds+1)]