Django objects.dates('date','month')查询已关闭一个月

时间:2012-12-03 17:05:51

标签: python django datetime

我在Django组建了一个计费系统,我遇到了一个奇怪的问题。在我的views.py中,我提出了一个查询,以确定付款的独特月份。然后,我重复这个月的清单,以确定每月支付多少钱。

查询有效,并且计算的数字是正确的,但是当我通过模板显示它时,它会关闭一个月。因此,当我进行查询时,我得到6月的总计,但最终我在模板中显示月份为5月。我知道快速破解这项工作很容易,但我想知道为什么会这样。

以下代码:

# views.py

def reports_index(request):
    payment_months = Payment.objects.dates('date', 'month')
    payments_by_month = []
    for p in payment_months:
         monthly_payment = Payment.objects.filter(date__year=p.year, date__month=p.month).aggregate(Sum('amount'))['amount__sum']
         yearly_payment = monthly_payment * 12
         payments_by_month.append([p, monthly_payment, yearly_payment])

    return render_to_response('reports.html', locals(), context_instance=RequestContext(request))


# reports.html

{% load humanize %}

<table cellpadding="0" cellspacing="0" width="100%" class="tableStatic resize">
        <thead>
            <tr>
                <th>Month</th>
                <th>Monthly Payments Recieved</th>
                <th>Yearly Payment Estimate</th>
            </tr>
        </thead>
        <tbody>
            {% for p in payments_by_month %}
                <tr class="gradeC">
                    <td>{{ p.0|date:"M Y" }}</td>
                    <td style="text-align:center;">${{ p.1|intcomma }}</td>
                    <td style="text-align:center;">${{ p.2|intcomma }}</td>
                </tr>
            {% endfor %}

        </tbody>
     </table>

以前有人见过这样的事吗?

1 个答案:

答案 0 :(得分:3)

Crikey!在一点帮助下,看起来我找到了自己问题的答案。

@esauro建议我检查{{p.0.month}}而不是{{p.0 | date:“M Y”}},所以这一切都是受他启发的。

{{p.0.month}} = 6

{{p.0 | date:“M Y”}} = 2012年5月

出现差异的原因是我的settings.py使用了时区信息而且我在美国 - 这让我比GMT和前一天晚了几个小时。因此,2012年5月,当我期待2012年6月。默认的Django设置是:

# If you set this to False, Django will not use timezone-aware datetimes.
USE_TZ = True

如果你设置:

USE_TZ = False

然后你没有时区感知的日期时间。问一个后续问题,这只发生在sqlite上吗?我只是运行一个开发服务器,我没有意识到这可能会在开发和生产之间发生变化。

这是我直到现在还没有真正欣赏过的东西。 DB有自己的日期和时间结构。 Django ORM有映射,但这取决于你的Django设置。 TZ设置中的微小变化很大程度上会影响您之前认为的一切。

希望这有帮助。