【问题标题】:Django queryset: cannot filter by current week when USE_TZ is enabledDjango 查询集:启用 USE_TZ 时无法按当前周过滤
【发布时间】:2018-12-17 10:08:21
【问题描述】:

我正在使用带有USE_TZ = TrueTIME_ZONE = 'UTC' 的Django 2.1。

这是我的模型 DateTimeField:

create_date = models.DateTimeField(_('date created'), null=True, auto_now_add=True)

我正在尝试根据周数获取当前周结果。我尝试了以下方法:

today = timezone.now()
current_week_num = today.isocalendar()[1]
week_results = MyModel.objects.filter(create_date__week=current_week_num).count()

当数据库中有记录时,这总是返回 0。如果我设置USE_TZ = False,它工作正常。我正在使用 MySql 数据库。

有什么想法吗?

更新:

问题在于 MySQL time_zone 表为空!我不得不跑: mysql_tzinfo_to_sql /usr/share/zoneinfo 问题就解决了!

【问题讨论】:

  • Iso 周从星期一开始。您确定不只是上周创建的记录吗?
  • @HåkenLid 我在数据库中有一条记录是 2018-12-17 11:57:28.892100,即第 51 周(我也尝试通过 50 而不是 current_week_num 但它没有改变)。如果我设置 USE_TZ = False,它会起作用。
  • 我已经打印了 USE_TZ true 和 false 的查询。这是我在启用 TZ 的情况下得到的:WEEK(CONVERT_TZ(create_date, 'UTC', 'UTC'), 3) = 51) 并且在禁用 TZ 的情况下(这是有效的):WEEK(@987654329 @.create_date, 3) = 51)
  • mysql 好像没有正确地从 UTC 转换为 UTC?我希望 CONVERT_TZ 函数不会更改输入值。也许您必须更改 mysql 服务器的一些时区设置? dev.mysql.com/doc/refman/8.0/en/time-zone-support.html
  • 问题是 MySQL 表 time_zone 是空的。运行命令 mysql_tzinfo_to_sql /usr/share/zoneinfo 后它起作用了!谢谢。

标签: python mysql django


【解决方案1】:

如果您的数据库不是 Postgres,那么https://docs.djangoproject.com/en/2.1/topics/i18n/timezones/#database 上的Other databases 部分可能会很有趣。

其他后端存储没有时区信息的日期时间。如果你 从 USE_TZ = False 切换到 USE_TZ = True,您必须将您的 从本地时间到 UTC 的数据——如果你的本地时间是不确定的 时间有夏令时。

【讨论】:

  • 我的数据库是 MYSQL,我正在尝试处理我的情况下的周数
  • @Giorgio:但是您在创建记录后切换到USE_TZ=True 了吗?如果是这样,您可能必须对已存储在数据库中的日期时间执行迁移。
  • @HåkenLid 实际上从一开始就没有设置 USE_TZ=True
【解决方案2】:

终于找到问题所在了,基本上MySQL time_zone表是空的,需要填写!

运行以下命令后:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

问题已经解决了!

【讨论】:

    猜你喜欢
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    相关资源
    最近更新 更多