Джанго: timezone.now против timezone.now ()

Я нахожусь в процессе обновления моего проекта с Django 1.8.2 до 1.9.7, и я получаю это предупреждение:

WARNINGS:
my_app.my_model.date_available: (fields.W161) Fixed default value provided.
HINT: It seems you set a fixed date / time / datetime value as default for this field. This may not be what you want. 
If you want to have the current date as default, use `django.utils.timezone.now

Вот строка из my_app / models.py:

from django.utils import timezone
...
class my_model(models.Model):
    ...
    datetime_released = models.DateTimeField(default=timezone.now() )

Если я уберу скобки и вместо этого использую:

datetime_released = models.DateTimeField(default=timezone.now )

Предупреждение Джанго уходит. В чем разница между двумя?

В другой области моего проекта я использую timezone.now () в фильтре наборов запросов:

def date_available(self):
        return self.filter(date_available__lte = timezone.now())

Здесь, если я удаляю скобки, выдается ошибка:

TypeError: expected string or buffer

Я могу получить обе эти две работы, добавив / убрав скобки по мере необходимости, но в чем разница междуtimezone.now() а такжеtimezone.now и почему они вызывают предупреждения / ошибки в этих случаях?

 gtalarico07 июл. 2016 г., 07:04
type (now ()) перезапускает объект datetime. type (сейчас) перезапускает метод сейчас

Ответы на вопрос(4)

Решение Вопроса

включая функции. Это означает, что вы можете повлиять на функцию переменной:

>>> from django.utils import timezone
>>> foo = timezone.now
>>> foo
<function django.utils.timezone.now>
>>> foo()
datetime.datetime(2016, 7, 7, 9, 11, 6, 489063)

Функция является вызываемым объектом:

>>> callable(foo)
True
>>> callable(foo())
False

когдаdefault получает вызываемое, вызываемое вызывается каждый раз, когда запрашивается значение по умолчанию.

С другой стороны, когда вы звонитеtimezone.now() до настройкиdefault, значение дано и зафиксировано. Напомним, что следующая строка выполняется только один раз при запуске сервера, поскольку это атрибут класса:

    datetime_released = models.DateTimeField(default=timezone.now())

и поэтомуtimezone.now() выполняется только один раз. Проходя вызываемыйtimezone.now позволяет пересчитать значение, когда это необходимо.

self.filter(date_available__lte = timezone.now()) ы хотите сделать запрос к БД на основе текущего времени. Так что вам нужно в формате строки.

datetime_released = models.DateTimeField(default=timezone.now) ы хотите, чтобы по умолчанию было текущее время. Таким образом, вы не можете иметь строку там. место этого вы предоставляете функцию, которая может возвращать текущее время.

timezone.now вызываемый, который выполняется во время выполнения, в то время какtimezone.now() возвращает вывод этой функции.

Дляmodels.DateTimeField, вам нужно использовать вызываемый. Еще лучше, просто установитеauto_now_add который делает это для вас:

datetime_released = models.DateTimeField(auto_now_add=True)

Фильтр, с другой стороны, не принимает вызываемый объект - он требует значения. Следовательно, вы должны оценитьtimezone.now() при передаче этого в качестве аргумента фильтра.

 Dorian Dore07 февр. 2019 г., 18:28
Что если вы хотите иметь модель с меткой времени создания? Будет лиtimezone.now() быть лучше в этом случае, чемtimezone.now, что в конечном итоге будет пересматриваться так часто?
 samu07 июл. 2016 г., 14:15
Здесь стоит упомянуть, что когда вы проходитеtimezone.now()вы фактически передаете вывод этой функции в тот момент, когда загружается django (это когда он оценивается), а когда вы передаетеtimezone.now вы передаете объект функции, который лениво оценивается django.

строку времени при загрузке. (отсюда и предупреждение Django!) (Файл модели, если он полностью выполняется при запуске сервера)

Метод now будет передавать метод now и будет выполняться только после создания экземпляра класса / модели, создавая отметку времени в нужное время (правильный путь и то, чего большинство людей пытаются достичь).

В примере фильтра он вызывается только при вызове функции фильтра. если вы не выполнили (now ()) и передадите метод, и никогда не создадите требуемый объект datetime. (ошибка, ожидал строку, получил, что-то еще)

Ваш ответ на вопрос