【问题标题】:Django filter current month dataDjango过滤当前月份数据
【发布时间】:2014-04-17 16:42:22
【问题描述】:

我想过滤当前月份的数据。我试过了。

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)

【问题讨论】:

  • “this_month”是否因 USE_TZ 而异?
  • datetime.datetime.now() 不包含任何时区数据。尝试改用django.utils.timezone.now()

标签: python django


【解决方案1】:

这是一个很老的问题,但我认为我的回答可以帮助人们搜索它。

首先,当 USE_TZ=True 时,我们应该始终使用 django.utils.timezone.now() 而不是 datetime.datetime.now()。 (ref)

Django 文档says:

当 USE_TZ 为 True 时,日期时间字段将转换为当前时间 过滤前的区域。这需要在 数据库。

它还提供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

现在我可以使用<datetime>__month 过滤器,即使USE_TZ = True

如果您需要进一步解释,请发表评论。

编辑

根据Jerzyk yesterday 的建议添加了有关 django.utils.timezone 的信息

【讨论】:

  • 为了回答的完整性,请添加信息,以便在使用时区时使用 django.utils.timezone.now() 作为当前日期时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多