Django аннотирует запрос для возврата значений времени в локальном времени, как это может сделать Extract
settings.py
:
TIME_ZONE = 'UTC'
USE_TZ = True
Я понимаю, что Django возвращает значения в запросах к модели в UTC. Если я хочу показать пользователям значения объектов datetime
, ориентированных на время localtime
, я могу сделать это в шаблонах и т.д. через timezone.activate
или timezone.override
.
У меня есть необходимость вернуть все datetime
значения в определенном часовом поясе, прежде чем они будут отображены в каком-либо шаблоне. С помощью timezone.activate
или timezone.override
я заметил, что `DateTimeField экстракты делают что-то близкое к тому, что я хочу:
import zoneinfo
from datetime import datetime
from django.utils import timezone
class Experiment(models.Model):
created_at = models.DateTimeField()
created_at = datetime(2015, 6, 15, 23, 30, 1, tzinfo=timezone.utc)
Experiment.objects.create(created_at = created_at)
tz = zoneinfo.ZoneInfo('Australia/Melbourne')
with timezone.override(tz):
qs = Trade.objects.annotate(hour=ExtractHour('created_at')).values('created_at', 'hour')
print(qs.query)
print(qs)
Выход
SELECT "experiment"."created_at", EXTRACT('hour' FROM "experiment"."created_at" AT TIME ZONE 'Australia/Melbourne') AS "hour" FROM "experiment"
<QuerySet [{'created_at': datetime.datetime(2015, 6, 15, 23, 30, 1, tzinfo=<UTC>), 'hour': 9}]>
Обратите внимание на час "Австралия/Мельбурн" и created_at
- UTC. Я хочу, чтобы все мои временные метки возвращались в указанную зону.
Есть ли Django-нативный или элегантный способ сделать это? Надеюсь, интегрированный с любым timezone.override
. Что-то вроде:
tz = zoneinfo.ZoneInfo('Australia/Melbourne')
with timezone.override(tz):
qs = Trade.objects.annotate(local_created_at=LocalTimeZone('created_at')).values('created_at', 'id')
Разное