Django default = timezone.now + delta
Попытка установить временную метку истечения срока действия ключа в модели Django и набросилась на эту проблему:
Мой текущий код:
key_expires = models.DateTimeField(default=timezone.now() + timezone.timedelta(days=1))
Приведенный выше код работает, однако, когда используется "timezone.now()", он получает временную метку времени, когда Apache был перезапущен, поэтому это не работает. Я провел некоторое исследование и нашел решение для этой части проблемы, поэтому, заменив "timezone.now()" на "timezone.now", я получаю текущую метку времени каждый раз, когда объект создается, что идеально, вопрос частично решен.
У меня возникли проблемы с изменением даты, используя "timezone.timedelta(days = 1)".
key_expires = models.DateTimeField(default=timezone.now + timezone.timedelta(days=1))
Ошибка, которую я получаю:
key_expires = models.DateTimeField(default=timezone.now + timezone.timedelta(days=1))
TypeError: неподдерживаемый тип операндов для +: 'функция' и 'datetime.timedelta'
Цель состоит в том, чтобы установить отметку времени на 24 часа вперед.
Любая помощь приветствуется.
Ответы
Ответ 1
default
принимает вызываемое, поэтому вам просто нужно написать функцию, которая делает то, что вы хотите, а затем предоставить это в качестве аргумента:
def one_day_hence():
return timezone.now() + timezone.timedelta(days=1)
class MyModel(models.Model):
...
key_expires = models.DateTimeField(default=one_day_hence)
(Как обсуждено здесь, не поддавайтесь искушению сделать это lambda
.)
Ответ 2
Я работаю над django 2.1.7, в этой версии не требуется писать функцию по default
. Вы можете просто использовать его, просто изменив свой предыдущий код:
key_expires = models.DateTimeField(default=timezone.now() + timezone.timedelta(days=1))
Если вы заметили разницу ()
после timezone.now
Вы можете timedelta
по ссылке для получения дополнительной информации о timedelta