Работа с несколькими базами данных в Django с часовыми поясами и без них

Я в ситуации, когда я использую 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 ?

У меня такая же разница в 1 час между Европой / Парижем и UTC.

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 о множественных базах данных и часовых поясах говорится:

Установите параметр TIME_ZONE на соответствующий часовой пояс для этой базы данных в настройке DATABASES.

Это полезно для подключения к базе данных, которая не поддерживает часовые пояса и не управляется Django, когда USE_TZ имеет значение True.

Сохраняет ли Django или PostgreSQL локальное время в UTC, даже если time_zone равен None? Есть идеи, как это решить? (Я не могу изменить схему базы данных T_T)


person user2652620    schedule 04.11.2019    source источник


Ответы (1)


отвечая на свой вопрос.

Чтобы иметь дело с datetime без часового пояса, datetimefield необходимо заменить на charfield.

person user2652620    schedule 13.04.2020