Django过滤当前月份数据
我想要筛选出当前月份的数据。我试过这样做。
this_month = datetime.datetime.now().month
products = Product.objects.filter(date_added__month=this_month)
但是,这个方法只在 USE_TZ = False
的情况下有效。如果我把它改成 USE_TZ = True
,我的筛选查询就不管用了。
模型
date_added = models.DateTimeField(auto_now=True)
1 个回答
4
这个问题虽然有点老了,但我觉得我的回答可以帮助到正在寻找这个问题的人。
首先,当设置了 USE_TZ=True
时,我们应该始终使用 django.utils.timezone.now()
,而不是 datetime.datetime.now()
。(参考链接)
Django 的文档 提到:
当
USE_TZ
为真时,日期时间字段在过滤之前会转换为当前时区。这需要数据库中有时区的定义。
文档还提供了关于如何在数据库中安装时区定义的说明:
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
现在即使 USE_TZ = True
,我也可以使用 <datetime>__month
过滤器了。
如果你需要进一步的解释,请留言。
编辑
根据 Jerzyk 昨天的建议,我添加了关于 django.utils.timezone
的信息。