按月和日过滤django datetime字段的问题

时间:2014-02-20 20:27:30

标签: python django datetime filtering

有人可以向我解释为什么以下过滤器在月和日级别无效吗?按年过滤似乎有效,但不是其他两个。

>>> clicks.count()
36
>>> date = clicks[0].created
>>> date.month
2
>>> date.year
2014
>>> date.day
1
>>> clicks.filter(created__month=2)
[]
>>> clicks.filter(created__month=02)
[]
>>> clicks.filter(created__month='02')
[]
>>> clicks.filter(created__month='2')
[]
>>> clicks.filter(created__month=date.month)
[]
>>> clicks.filter(created__day=date.day)
[]

快速更新,以证明我在创建和处理查询集之前获得了相同的行为:

>>> clicks = PreviewClick.objects.filter(created__month = 2)
>>> clicks.count()
0
>>> clicks = PreviewClick.objects.filter(created__month = 02)
>>> clicks.count()
0
>>> clicks = PreviewClick.objects.filter(created__month = '02')
>>> clicks.count()
0
>>> clicks = PreviewClick.objects.filter(created__month = '2')
>>> clicks.count()
0

这里有更多值得深思的东西:

>>> clicks = PreviewClick.objects.all()
>>> counter = 0
>>> for click in clicks:
...      if click.created.month == 2:
...           counter += 1
... 
>>> counter
35

4 个答案:

答案 0 :(得分:19)

我看到了与你完全相同的行为。

如果您检查documentation的1.6和月份查询集。他们增加了以下段落:

  

“当USE_TZ为True时,日期时间字段将在过滤前转换为当前时区。这需要数据库中的时区定义。”

如果您将设置中的以下行更改为False,那么您应该开始获取您期望的数据。

USE_TZ = False

答案 1 :(得分:14)

@Simon Wilder完全回答了为什么它无法正常工作,以下是如何在不禁用django中的TZ支持的情况下实际解决问题

Django文档给instruction安装时区定义到数据库:

  

SQLite:install pytz - 转换实际上是在Python中执行的。

     

PostgreSQL:没有要求(见时区)。

     

Oracle:没有要求(请参阅选择时区文件)。

     

MySQL:安装pytz并使用mysql_tzinfo_to_sql加载时区表。

在我的情况下:mysql和Mac Os,以下命令解决问题:

sudo mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -u root mysql

答案 2 :(得分:2)

您的语法不正确。它应该是:

Clicks.objects.filter(created__month=2)

(你离开'对象'经理)

答案 3 :(得分:0)

要在此处更新答案,因为我遇到了上述问题,但没有一个解决方案有效。大多数新的mysql安装预先安装了tz-info,因此mysql_tzinfo_to_sql命令不会真正有用。并且将TZ_INFO设置为False并不是真正的解决方案,因为许多需要时区感知日期时间。

所以,对我有用的是创建一个tz感知日期时间对象并检查它。让我们说你想过滤今天你会做的事情,

from datetime import datetime
import pytz

today = datetime.now().replace(tzinfo=pytz.UTC).date()   # tz aware datetime object
todays_records = myModel.objects.filter(created__year=today.year, created__month=today.month,created__day=today.day)

希望这有帮助。