/ / Часовий пояс у Django, DRF та PostgreSQL належні налаштування - django, часовий пояс, django-rest-framework

Часовий пояс у Django, DRF та PostgreSQL належні налаштування - django, часовий пояс, django-rest-framework

Я налаштував часовий пояс у Django 1.8 (моя поточна часова зона - UTC + 1 або BST):

TIME_ZONE = "Europe/London"
USE_I18N = True
USE_L10N = True
USE_TZ = True

У моїй моделі є атрибут timestamp:

class NodeGPS(models.Model):
node_id = models.ForeignKey(Node)
timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
gps_latitude = models.FloatField(null=True, blank=True)
gps_longitude = models.FloatField(null=True, blank=True)

У мене є Django Rest Framework 3.4.0, тому, коли я публікую дані через часовий покажчик веб-інтерфейсу DRF, автоматично встановлюється UTC, що на 1 годину від мого поточного часу (UTC + 1). Однак у полі PostgreSQL часовий покажчик встановлюється як UTC + 1. Але у веб-інтерфейсі DRF завжди відображається час у UTC.

Яка дивна поведінка. Що є причиною цього?

Заздалегідь дякую за будь-які пропозиції!

Відповіді:

2 для відповіді № 1

Поки часи перетворюються у місцевий часовий поясу шаблонах і формах вони не перетворюються на серіалізатори (і, отже, зазвичай є UTC, за винятком створення об'єкта, коли вони незалежно від завантаження клієнта). Припущення полягає в тому, що кожен, хто використовує API, буде використовувати його за допомогою клієнта з власним способом обробки часових поясів.

Рішення - створити спеціальне поле datetime, яке перетворює в правильний часовий пояс. Дивіться тут: DjangoRestFramework ModelSerializer DateTimeField перетворює лише на поточний часовий пояс при створенні об'єкта

Також: Остерігайтеся поля PostgreSQL Timestamp. Це лише показує, що час було перетворено в часовий пояс, який сервер вважає своїм, як (з документів):

Усі дата та час, що знаходяться в часі, зберігаються всередині UTC. Вони перейдуть до місцевого часу в зоні, зазначеної параметром конфігурації часового поясу, перед тим, як вони будуть показані клієнту.