我有一个数据库表,其中包含2年内的“票”。每张票都有工作日期。我要一年一个月的总票数(例如2018年1月与2019年1月不同)。
当我在拼凑这个问题时,我偶然发现了一些有用的东西,但我不知道为什么。或者查询是否有意义。这里是:

qs = Ticket.filter(work_date__range=[datetime.date(2018, 1, 1),
datetime.date.today()]).\
annotate(year=ExtractYear('work_date'),
month=ExtractMonth('work_date')).\
values('year','month').\
annotate(count=Count('month')).order_by('year', 'month')

提供此输出:
{'count': 13816, 'year': 2018, 'month': 1},
{'count': 12778, 'year': 2018, 'month': 2},
{'count': 13960, 'year': 2018, 'month': 3},
{'count': 14128, 'year': 2018, 'month': 4},
{'count': 15277, 'year': 2018, 'month': 5},
{'count': 15689, 'year': 2018, 'month': 6},
{'count': 14905, 'year': 2018, 'month': 7},
{'count': 16025, 'year': 2018, 'month': 8},
{'count': 14044, 'year': 2018, 'month': 9},
{'count': 16332, 'year': 2018, 'month': 10},
{'count': 15397, 'year': 2018, 'month': 11},
{'count': 14348, 'year': 2018, 'month': 12},
{'count': 17166, 'year': 2019, 'month': 1},
{'count': 15504, 'year': 2019, 'month': 2},
{'count': 16311, 'year': 2019, 'month': 3},
{'count': 14910, 'year': 2019, 'month': 4},
{'count': 440, 'year': 2019, 'month': 5}

我的期望是,由于聚合函数仅按“月”进行计数,例如,无论年份如何,所有第1个月都将在同一个计数中。
我按月运行了一个简单的查询,并使用了.count()方法,得到了与上面相同的结果。所以计数是正确的。
为什么这么做?有更好的办法吗?

最佳答案

因为这是你的价值观,所以你可以按年/月组合来分组。如果要按月计数,请将values('year','month')更改为values('month')
计数只是你正在计数的字段。
你可以数一数“身份证”,你会得到相同的号码。
您可以始终查看生成的查询,这可能会使事情更清楚。

print(qs.query)

09-17 13:14