Получение списка пользователей, когда в их часовом поясе наступает полночь

Мне нужно отправить электронное письмо моим пользователям, когда в их часовом поясе наступит полночь. Я думаю, что мой подход хорош, но у меня проблема с функцией 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
)
Вернуться на верх