Получение списка пользователей, когда в их часовом поясе наступает полночь
Мне нужно отправить электронное письмо моим пользователям, когда в их часовом поясе наступит полночь. Я думаю, что мой подход хорош, но у меня проблема с функцией Django F() в моем запросе.
Вот запрос:
target_offset = 0 - timezone.now().hour
users_to_email = User.objects.exclude(
timezone__isnull=True
).annotate(
tz_offset=Value(
int (datetime.now(F('timezone')).strftime('%z')) / 100,
models.IntegerField()
)
).filter(
tz_offset=target_offset
)
Я получаю эту ошибку:
int (datetime.now(F('timezone')).strftime('%z')) / 100,
File "/Users/leeloftiss/Desktop/daisy_coder/website/djangoEnv/lib/python3.8/site-packages/freezegun/api.py", line 386, in now
result = tz.fromutc(now.replace(tzinfo=tz)) + cls._tz_offset()
AttributeError: 'F' object has no attribute 'fromutc'
Если я просто вызываю F('timezone') вне функции datetime.now(), я получаю фактическое значение из колонки TIMEZONE пользователей.
Поэтому я думаю, что мне просто нужно знать, как я могу получить это значение в данном случае, когда оно мне нужно в функции datetime.now().
Примечание: Я использую SQL, а не Postgres
Django будет фильтровать на стороне базы данных, поэтому использование datetime.now(F('timezone')) не сработает. Что вы можете сделать, так это "подготовить" список часовых поясов с заданным смещением:
from pytz import all_timezones, timezone
from datetime import datetime, timedelta
now = datetime.utcnow()
day = timedelta(days=1)
target_offset = timedelta(hours=-timezone.now().hour) % day
timezones = {
tz
for tz in all_timezones
if timezone(tz).utcoffset(now) % day == target_offset
}
Это создаст набор timezones, содержащий имена всех часовых поясов с заданным смещением. Далее мы можем отфильтровать пользователей для этого часового пояса:
users_to_email = User.objects.filter(
timezone__in=timezones
)