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')

Разное

Вернуться на верх