Если вы включили часовые пояса (USE_TZ = True
в ваших настройках), тогда django позаботится о том, чтобы все даты были сохранены в часовом поясе UTC и получены в часовом поясе UTC.
При отображении они будут использовать текущий часовой пояс (settings.TIME_ZONE
или другой, если вы его активируете), чтобы отобразить их в соответствующем часовом поясе. При получении ввода из форм он преобразует их в UTC.
Также обратите внимание, что date
(2019-01-02) не может быть привязан к часовому поясу, только datetime
, поскольку без времени часовые пояса не имеют смысла.
Так что в вашем случае вам нужно сообщить Django, что вы хотите фильтровать по дате в часовом поясе MKS. Вы можете использовать Trunc
для этого:
from django.db.models.functions import Trunc
from django.db.models import DateTimeField
import pytz
from datetime import datetime
mks_filter_day = pytz.timezone("Europe/Moscow").localize(datetime(2010, 1, 2))
Account.objects.exclude(contract_date__isnull=True).annotate(
mks_day=Trunc('contract_date', 'day', output_field=DateTimeField(), tzinfo=pytz.timezone("Europe/Moscow")))\
.filter(mks_day=mks_filter_day)
# or in Django 1.11 the above doesn't work due to a bug
Account.objects.exclude(contract_date__isnull=True).annotate(
mks_day=Trunc('contract_date', 'day', output_field=DateTimeField(), tzinfo=pytz.timezone("Europe/Moscow")))\
.filter(mks_day__contains=datetime.date(2010, 1, 2))
Указывает базе данных преобразовать дату и время в MKS и усекает день перед сравнением с контрольной датой. Я уверен, что contract_date
не равно нулю, иначе вы получите ошибку.