У меня есть ниже модель дб:
from datetime import datetime
class TermPayment(models.Model):
# I have excluded fields that are irrelevant to the question
date = models.DateTimeField(default=datetime.now(), blank=True)
Я добавляю новый экземпляр, используя ниже:
tp = TermPayment.objects.create(**kwargs)
Моя проблема: все записи в базе данных имеют одинаковое значение в поле даты, которое является датой первого платежа. После перезапуска сервера одна запись имеет новую дату, а другие записи совпадают с первой. Похоже, что некоторые данные кэшируются, но я не могу найти где.
база данных: mysql 5.1.25
Джанго v1.1.1
default=datetime.now
- обратите внимание, без вызова как вnow()
Не стандарт для DateTimeField, но ... удобно в любом случае.Ответы:
похоже,
datetime.now()
что оценивается, когда модель определена, а не каждый раз, когда вы добавляете запись.В Django есть функция для достижения того, что вы уже пытаетесь сделать:
или
Разница между вторым примером и тем, что у вас есть, заключается в отсутствии скобок. Передавая
datetime.now
без скобок, вы передаете фактическую функцию, которая будет вызываться при каждом добавлении записи. Если вы передадите егоdatetime.now()
, вы просто оцените функцию и передадите ей возвращаемое значение.Более подробная информация доступна в справочнике моделей Django.
источник
expiry = models.DateTimeField(default=datetime.now + timedelta(days=30))
def now_plus_30(): return datetime.now() + timedelta(days = 30)
, и затем использоватьmodels.DateTimeField(default=now_plus_30)
default=lambda: datetime.now()+timedelta(days=30)
Вместо использования
datetime.now
вы должны действительно использоватьfrom django.utils.timezone import now
Ссылка:
django.utils.timezone.now
так что перейдите на что-то вроде этого:
источник
auto_now_add
(с учетом часового пояса), вы можете получить неверные расчеты из-за различий в часовых поясах.Из документации по стандартному полю модели django:
Значение по умолчанию для поля. Это может быть значение или вызываемый объект. Если он вызывается, он будет вызываться каждый раз, когда создается новый объект.
Поэтому должно работать следующее:
источник
default
( django-chinese-docs-14.readthedocs.io/en/latest/ref/models/… )У Дэвида был правильный ответ. Скобки () делает это так , что вызываемая timezone.now () вызывается каждый раз , когда модель оценена. Если вы удалите () из timezone.now () (или datetime.now (), если используете наивный объект datetime), чтобы сделать это просто так:
Тогда он будет работать так, как вы ожидаете:
новые объекты получат текущую дату при их создании, но дата не будет переопределена каждый раз, когда вы выполняете manage.py makemigrations / migrate.
Я только что столкнулся с этим. Большое спасибо Дэвиду.
источник
datetime.now()
Оценивается при создании класса, не тогда , когда новая запись добавляется в базу данных.Для достижения того, что вы хотите, определите это поле как:
Таким образом,
date
поле будет установлено на текущую дату для каждой новой записи.источник
Ответ на этот вопрос на самом деле неправильный.
Автоматическое заполнение значения (auto_now / auto_now_add отличается от значения по умолчанию). Значение по умолчанию будет фактически тем, что видит пользователь, если это совершенно новый объект. Что я обычно делаю, это:
Убедитесь, что если вы пытаетесь представить это на странице администратора, вы перечислили это как «read_only» и указали имя поля
Опять же, я делаю это, поскольку мое значение по умолчанию обычно не редактируется, а страницы администратора игнорируют нередактируемые, если не указано иное. Однако есть определенная разница между установкой значения по умолчанию и реализацией auto_add, который здесь является ключевым. Проверьте это!
источник
datetime.now()
оценивается один раз, когда создается экземпляр вашего класса. Попробуйте удалить круглые скобки, чтобы функцияdatetime.now
была возвращена и ТОГДА оценена. У меня была та же проблема с установкой значений по умолчанию для моихDateTimeField
s и я написал свое решение здесь .источник
Из справочника по языку Python, под определениями функций :
К счастью, у Django есть способ сделать то, что вы хотите, если вы используете
auto_now
аргумент дляDateTimeField
:Смотрите Django документы для DateTimeField .
источник
В Django 3.0
auto_now_add
похоже работаетauto_now
reg_date=models.DateField(auto_now=True,blank=True)
источник