В чем разница между timezone.now и db.models.functions.Now?

Может ли кто-нибудь объяснить разницу между 'django.db.models.functions.Now' и 'django.utils.timezone.now'?

Например, правильно ли я понимаю, что functions.Now() возвращает системное время без метки часового пояса, а timezone.now() возвращает метку времени UTC?

Когда я использую print(timezone.now()), я получаю ожидаемую метку времени, но когда я print(functions.Now()), я получаю пустую строку. Почему так происходит?

При каких обстоятельствах целесообразно использовать один метод вместо другого?

The timezone.now(…) function [Django-doc] returns a datetime object with the timezone, given the USE_TZ setting [Django-doc] is used.

Now [Django-doc], с другой стороны, является выражением базы данных. Действительно, оно не определяет datetime. Он будет использовать NOW() на стороне базы данных, где вы делаете запрос. Таким образом, он будет работать с часами базы данных. Если база данных работает на том же сервере, то это серверное время, тогда как если она работает на другом сервере, оно может быть на несколько секунд/минут раньше/позже, если часы двух систем не полностью синхронизированы.

Если вы таким образом запросите с:

from django.utils import timezone

Post.objects.filter(published_at__lte=timezone.now())

Затем он составит запрос, который будет выглядеть следующим образом:

SELECT post.*
FROM post
WHERE published_at <= 2022-07-27 15:40:00  -- time from Django/Python

, тогда как если мы используем:

from django.db.models.functions import Now

Post.objects.filter(published_at__lte=Now())

он запросит:

SELECT post.*
FROM post
WHERE published_at <= NOW()  -- databae timestamp
Вернуться на верх