Django TimeField сохраняется с неправильным часовым поясом
У меня есть простая модель группы:
class Group(models.Model):
leader = models.ForeignKey(User, on_delete=models.CASCADE)
name = models.CharField(max_length=55)
description = models.TextField()
joined = models.ManyToManyField(User, blank=True)
start_time = models.TimeField(null=True)
end_time = models.TimeField(null=True)
email_list = ArrayField(
models.CharField(max_length=255, blank=True),
blank=True,
default=list,
)
DAYS = [
('Sundays', 'Sundays'),
('Mondays', 'Mondays'),
('Tuesdays', 'Tuesdays'),
('Wednesdays', 'Wednesdays'),
('Thursdays', 'Thursdays'),
('Fridays', 'Fridays'),
('Saturdays', 'Saturday7'),
]
meeting_day = MultiSelectField(
verbose_name = 'Meeting day(s)',
choices=DAYS,
max_choices=7,
max_length=255
)
Когда пользователи создают группу, они должны выбрать время начала. У меня есть периодическая задача celery, которая запускается каждую минуту, проверяя, что до начала работы группы осталось 30 минут, чтобы отправить уведомления всем пользователям на email_list
.
Проблема, с которой я сталкиваюсь, заключается в том, что время, вводимое пользователем, всегда неверно. Если пользователь хочет, чтобы его группа начинала работу в 9:00 утра, в базе данных это время сохраняется в 13:00, и задание сельдерея отправляется в неправильное время
В моем файле настроек UTC установлено на true, поэтому я предположил, что оно универсально, т.е. какое бы время ни выбрал пользователь, оно будет сохранено в UTC, которое может выглядеть иначе, но все равно синхронизируется.
Вот мое расписание:
app.conf.beat_schedule = {
'start_group_notification': {
'task': 'start_group_notification_task',
'schedule': crontab(),
}
}
и вот задача:
@shared_task(name='start_group_notification_task')
def start_group_notification_task():
thirty_minutes_from_now = datetime.datetime.now() + datetime.timedelta(minutes=30)
chaburahs = Group.objects.filter(
start_time__hour=thirty_minutes_from_now.hour,
start_time__minute=thirty_minutes_from_now.minute
).prefetch_related("joined")
for group in groups:
for email in group.email_list:
send_mail (
'group starting in 30 minutes',
group.name,
NOTIFICATION_EMAIL,
[email],
fail_silently=False
)
То, что я хочу, довольно просто, но я не знаю, как это исправить, поскольку я не совсем понимаю, в чем проблема. Возможно, я не понимаю UTC, но когда пользователь создает группу, которая должна начинаться в 9:00 утра EST, независимо от того, в каком часовом поясе находится присоединившийся пользователь, она будет начинаться в 9:00 утра EST. Конечно, для пользователя это может быть другое время, но она всегда будет начинаться в 9:00AM EST. Итак, я не понимаю, почему модель не фильтруется и задание не отправляется, если время сохранено в UTC.
И последнее, мой админ django говорит, что мои поля времени "опережают время сервера на четыре часа", но я не уверен, UTC это или что-то другое.