【问题标题】:Dealing with multiple databases in Django with and without timezones在有和没有时区的 Django 中处理多个数据库
【发布时间】:2020-02-29 17:20:11
【问题描述】:

我的情况是使用 django (2.0.7) 处理多个数据库:

  1. database_A:无时区;
  2. database_B:时区为“欧洲/巴黎”;

settings.py

USE_TZ = True
TIME_ZONE = 'Europe/Paris'

DATABASES = {
  'database_A': {
     'NAME': ...
     'PASSWORD': ... etc.
     'TIME_ZONE': None,
     # still raise RuntimeWarning; received a naive datetime while time zone support is active.
},
  'database_B': {
    'NAME': ..., etc.
}

关于数据库 A 的模型

class Something(models.Model):
   date_creation = models.DateTimeField()

   def save(self, *args, **kwargs):
       if self._state.adding is True:
          self.date_creation = timezone.datetime.now()  # naive 

       print("BEFORE SAVE")
       print(self.date_creation)

       super(Something, self).save(*args, **kwargs)

       print("AFTER SAVE")
       print(self.date_creation)

       print("AFTER REFRESH")
       self.refresh_from_db()
       print(self.date_creation)

我得到以下结果

 BEFORE SAVE
 2019-11-04 11:44:35.233876
 AFTER SAVE
 2019-11-04 11:44:35.233929
 AFTER REFRESH
 2019-11-04 10:44:35.23392             # 10:44:35  , what's wrong ô_O ?

我在欧洲/巴黎和 UTC 之间有相同的 1 小时差。

import pytz
from datetime import datetime
datetime.now(tz=pytz.timezone('Europe/Paris')), timezone.now()

(datetime.datetime(2019, 11, 4, 12, 10, 55, 320028, tzinfo=<DstTzInfo 'Europe/Paris' CET+1:00:00 STD>),
 datetime.datetime(2019, 11, 4, 11, 10, 55, 320077, tzinfo=<UTC>))

所以,我认为 PostgreSQL 正在使用 UTC 来保存我认为是时区感知日期时间的天真的日期时间?

在数据库中我有以下时间

\d something_table
date_creation           | timestamp without time zone | non NULL Par defaut, now()

 SELECT NOW();
              now
-------------------------------
 2019-11-04 11:45:48.907105+01             # consider delay, changing terminal to launch query;
(1 ligne)

Django documentation 关于多个数据库和时区说:

为此将 TIME_ZONE 选项设置为适当的时区 DATABASES 设置中的数据库。

这对于连接不支持时间的数据库很有用 当 USE_TZ 为 True 时,它​​不由 Django 管理。

即使 time_zone 为 None ,Django 或 PostgreSQL 是否会将本地时间保存为 UTC? 知道如何解决吗? (我无法更改数据库架构 T_T)

【问题讨论】:

    标签: django timezone multi-database


    【解决方案1】:

    回答我自己的问题。

    要处理没有时区的日期时间,必须将日期时间字段替换为字符字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-21
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多