В чем разница между 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