2014-02-20 47 views
12

有人可以向我解释为什么以下过滤器不能在月和日级别工作?按年过滤似乎有效,但不是其他两种。根据月份和日期过滤django datetime字段的问题

>>> 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) 
[] 

快速更新,以证明我创造和处理一个QuerySet之前获得相同的行为:

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

你是如何创建点击的? – Hoopdady

+0

你确定你点击了'创建'日期为2月?我只是在我们的一个数据库上试过这个过滤器,它对我来说工作得很好。 – user590028

+1

它看起来像你做 .objects.all(),并指定它点击,然后试图过滤它。您可能想要做 .objects.filter(....) – Hoopdady

回答

12

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

如果您检查documentation为1.6和月查询集。他们添加了以下内容:

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

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

USE_TZ = False 
+0

嗯......有趣。我会试试看看会发生什么。我想我是新来处理时区 - 我试图根据时区等正确过滤,虽然我只使用UTC实际的数据库记录。我一直在视图中进行时区计算。如果我以这种方式处理它,我不需要USE_TZ吗? – zorrotmm

+0

我还没有处理时区恐怕并不需要为我目前的项目,所以我现在对我的修复已经足够了。我希望这些信息能够让你再次使用代码。 –

2

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

Clicks.objects.filter(created__month=2) 

(你离开了“对象”经理)

+0

我想我没有指定点击是我已经用.all()获得的查询集,或者在2014年过滤,这似乎工作。 filter()函数应该可以工作。无论如何,我会更新这个问题,以证明我在创建查询集之前获得了相同的结果。 – zorrotmm

8

@Simon Wilder完美回答为什么它不工作,这里是你如何能真正解决问题,而不在Django禁用TZ支持

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

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

这应该是正确的答案 – Khonix

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) 

希望这会有所帮助。

相关问题