有人可以向我解释为什么以下过滤器在月份和日期级别不起作用吗?按年份进行过滤似乎有效,但其他两个方法却无效。
>>> 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
Django文档给出了将时区定义安装到数据库的指令:
SQLite:安装pytz-转换实际上是在Python中执行的。
pytz
PostgreSQL:无要求(请参阅时区)。
Oracle:无要求(请参阅选择时区文件)。
MySQL:使用安装pytz和加载时区表mysql_tzinfo_to_sql。
mysql_tzinfo_to_sql
在我的情况下:mysql和Mac Os,以下命令解决了这个问题:
sudo mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -u root mysql
我看到的行为与你完全一样。
如果你查看1.6和月份查询集的文档。他们添加了以下段落:
“当USE_TZ为True时,日期时间字段将在过滤之前转换为当前时区。这需要数据库中的时区定义。”
如果将设置中的以下行更改为False,则应该开始取回期望的数据。
USE_TZ = False