RuntimeWarning: DateTimeField Initiative.date получило наивный дататайм при активной поддержке часовых поясов

Я пытаюсь отфильтровать набор запросов, чтобы получить все сообщения за этот год.

def thisYearQuerySet(objects):
    start_day = datetime.date(datetime.date.today().year, 1, 1)
    end_day = datetime.date(datetime.date.today().year, 12, 31)
    return objects.filter(date__range=[start_day, end_day])

django стонет о start_day и end_day декларация может конфликтовать django.utils.timezone, я думаю, что это не большая проблема.


Но предупреждение раздражает, любое предложение по его отключению (не отключать предупреждение django) будет оценено по достоинству.

django стонет о том, что объявление start_day и end_day может конфликтовать с django.utils.timezone, я думаю, что это не большая проблема.

.

Это зависит от уровня риска, который вас устраивает. Если не учитывать часовой пояс пользователя, thisYearQuerySet может вернуть объекты прошлого года или текущего года, когда вы приближаетесь к новому году.

Это происходит потому, что сервер может работать по времени GMT, что означает, что в 2022-01-01 00:00:00T00:00 он начнет возвращать данные с датами 2022 года. Однако американцы, использующие приложение, будут знать, что год 2021 еще 4+ часа назад, и будут ожидать увидеть данные 2021 года до своей полуночи.

Однако, если вы пытаетесь заглушить предупреждение и не заботитесь о вышеописанном сценарии, не используйте функции python datetime для получения today/now. Используйте:

from django.utils import timezone
now = timezone.now()
today = timezone.now().date()
Вернуться на верх