Django lambda函数给出了错误的结果

时间:2017-06-09 14:26:36

标签: django

我试图在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为:

enter image description here

因此,一切都很好。 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
}]

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))