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

zor*_*tmm 21 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)
[]
Run Code Online (Sandbox Code Playgroud)

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

>>> 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
Run Code Online (Sandbox Code Playgroud)

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

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

Sim*_*der 23

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

如果您查看1.6和月份查询集的文档.他们增加了以下段落:

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

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

USE_TZ = False
Run Code Online (Sandbox Code Playgroud)


ele*_*oet 15

@Simon Wilder完美地回答了为什么它不起作用,这里是如何在不禁用django中的TZ支持的情况下实际解决它

Django文档给出了向数据库安装时区定义的指令:

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
Run Code Online (Sandbox Code Playgroud)

  • 确实,这应该是正确的答案。几乎每个项目都应该使用时区感知日期。 (3认同)