Подтвердить что ты не робот

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 часа вперед.

Любая помощь приветствуется.

4b9b3361

Ответ 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