一尘不染

按月和日过滤Django日期时间字段

django

有人可以向我解释为什么以下过滤器在月份和日期级别不起作用吗?按年份进行过滤似乎有效,但其他两个方法却无效。

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

阅读 439

收藏
2020-04-02

共2个答案

一尘不染

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

SQLite:安装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
2020-04-03
一尘不染

我看到的行为与你完全一样。

如果你查看1.6和月份查询集的文档。他们添加了以下段落:

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

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

USE_TZ = False
2020-04-03