Использование django objects.filter для фильтрации в БД с помощью поля datetime, но только для даты и на основе местного времени, а не UTC

#python #django #datetime

#python #django #datetime

Вопрос:

РЕДАКТИРОВАТЬ: я пытаюсь получить проверки и проверки за текущий день. Код, который у меня есть, таков:

 def select_users():
    currentTime = dt.now()
    today = dt.today()    
    midNight = dt.combine(today, dt.min.time())
    print(currentTime)
    loggedIn = OnSiteLog.objects.filter(autoCheckin=False, checkIn__gte = midNight, checkOut__lte = currentTime).count()
  

Это выдает мне предупреждение:

 /usr/local/lib/python3.6/dist-packages/django/db/models/fields/__init__.py:1421: RuntimeWarning: DateTimeField OnSiteLog.checkOut received a naive datetime (2020-09-22 21:34:55.366769) while time zone support is active.
    
/usr/local/lib/python3.6/dist-packages/django/db/models/fields/__init__.py:1421: RuntimeWarning: DateTimeField OnSiteLog.checkIn received a naive datetime (2020-09-22 00:00:00) while time zone support is active.
  RuntimeWarning)
/usr/local/lib/python3.6/dist-packages/django/db/models/fields/__init__.py:1421: RuntimeWarning: DateTimeField OnSiteLog.checkOut received a naive datetime (2020-09-22 21:38:11.660009) while time zone support is active.
  RuntimeWarning)
  

Я знаю, что все мои данные при регистрации и оформлении заказа хранятся как UTC. Я просто не уверен, как запросить, чтобы просто предоставить мне все проверки с полуночи в день до 11:55 вечера в тот же день.

(почти 24 часа)

Комментарии:

1. итак, вы хотите фильтровать объекты по определенному дню UTC? например, всего 23 сентября 2020 года

2. ваш вопрос сбивает с толку, вы должны переписать его более четко, особенно часть о переносе (что вы ожидаете получить в этой ситуации), если вы сохраняете данные в базе данных в UTC, почему бы вам просто не преобразовать свое местное время в время UTC и запросить с его помощью

3. обновлено, чтобы, надеюсь, сделать его более понятным.

Ответ №1:

Вам следует взглянуть на документ о часовых поясах «Когда включена поддержка часовых поясов, Django хранит информацию о дате и времени в UTC в базе данных, использует внутри себя объекты datetime с учетом часового пояса и преобразует их в часовой пояс конечного пользователя в шаблонах и формах». Вам не нужно беспокоиться о UTC в dabase при правильной настройке часового пояса в файле конфигурации.

https://docs.djangoproject.com/en/3.1/topics/i18n/timezones/

Комментарии:

1. Итак, я считаю, что я сделал это, и если это так, то все, в чем я не уверен, — это как фильтровать поля проверки или проверки (оба объекта datetimeobjects), но только в сам день (игнорируя время)

2. Вы можете фильтровать следующим образом «OnSiteLog.objects.filter(autoCheckin= False, проверка __date__gte = полночь, проверка__date__lte = текущее время).count ()» используя «checkIn__date», вы сможете фильтровать только по дате