我试图在Django过去12个月内每月获得一些计算数据。我的功能如下:
def calculations_per_month_last_12_months(member_number):
items = list(Calculations.objects
.filter(user__member__number=member_number)
.filter(price_date__gte=datetime.datetime.now().today() - relativedelta(months=12))
.annotate(month=TruncMonth('price_date'))
.values('month')
.annotate(total=Count('id'))
.values('month', 'total')
.order_by('month'))
result = []
for month in range(12):
date = timezone.now() - relativedelta(months=month)
month_results = list(filter(lambda i: date <= i['month'] < (date + relativedelta(months=1)), items))
month_result = 0
if month_results:
month_result = month_results[0]['total']
result.append({
'month': date.strftime('%B'),
'total_calculations': month_result
})
return result
在项目中,我得到了我想要的但问题出在for
循环中。
例如,我得到可能 june 需要的内容。
我为一个用户获得的结果是:
[{
'month': 'June',
'total_calculations': 0
}, {
'month': 'May',
'total_calculations': 1
}, {
'month': 'April',
'total_calculations': 4
}, {
'month': 'March',
'total_calculations': 0
}, {
'month': 'February',
'total_calculations': 0
}, {
'month': 'January',
'total_calculations': 0
}, {
'month': 'December',
'total_calculations': 0
}, {
'month': 'November',
'total_calculations': 0
}, {
'month': 'October',
'total_calculations': 0
}, {
'month': 'September',
'total_calculations': 0
}, {
'month': 'August',
'total_calculations': 0
}, {
'month': 'July',
'total_calculations': 0
}]
因此,对于6月,total_calculations
可能应为total_calculations
,等等。
该用户的数据库中的price_date
为:
因此,一切都很好。 1月1日计算,5月4日计算。
知道我做错了什么吗?
修改
产品:
[{
'month': datetime.datetime(2017, 5, 1, 0, 0, tzinfo = < django.utils.timezone.LocalTimezone object at 0x10774fb00 > ),
'total': 4
}, {
'month': datetime.datetime(2017, 6, 1, 0, 0, tzinfo = < django.utils.timezone.LocalTimezone object at 0x10774fb00 > ),
'total': 1
}]
答案 0 :(得分:0)
我解决了它添加一个月i['date'] + relativedelta(months=1)
,这可能不太理想,但它有效。
因此,而不是:
month_results = list(filter(lambda i: date <= i['date'] < (date + relativedelta(months=1)), items))
现在我有:
month_results = list(filter(lambda i: date <= i['date'] + relativedelta(months=1) < (date + relativedelta(months=1)), items))