Django过滤当前月份数据

2 投票
1 回答
8440 浏览
提问于 2025-04-18 03:09

我想要筛选出当前月份的数据。我试过这样做。

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 的信息。

撰写回答