Я имею ниже модели дб:
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
django v1.1.1
похоже, что datetime.now()
оценивается, когда модель определена, а не каждый раз, когда вы добавляете запись.
В Django уже есть функция для выполнения того, что вы пытаетесь сделать:
date = models.DateTimeField(auto_now_add=True, blank=True)
или
date = models.DateTimeField(default=datetime.now, blank=True)
Разница между вторым примером и тем, что у вас сейчас, заключается в отсутствии круглых скобок. Передавая datetime.now
без круглых скобок, вы передаете фактическую функцию, которая будет вызываться каждый раз, когда добавляется запись. Если вы передаете datetime.now()
, то вы просто оцениваете функцию и передаете ей возвращаемое значение.
Более подробную информацию можно найти в справочнике по полям модели Django
Из документации о поле по умолчанию модели django:
Значение по умолчанию для поля. Это может быть значение или вызываемый объект. Если вызываемый, он будет вызываться каждый раз при создании нового объекта.
Следовательно, должно работать следующее:
date = models.DateTimeField(default=datetime.now,blank=True)
Функция datetime.now()
оценивается при создании класса, а не при добавлении новой записи в базу данных.
Чтобы добиться желаемого, определите это поле так:
date = models.DateTimeField(auto_now_add=True)
Таким образом, поле date
будет устанавливаться в текущую дату для каждой новой записи.
Из справочника по языку Python, в разделе Определения функций:
Значения параметров по умолчанию оцениваются при выполнении определения функции. Это означает, что выражение оценивается один раз, когда функция определена, и это же "предварительно вычисленное" значение используется для каждого вызова.
К счастью, в Django есть способ сделать то, что вы хотите, если вы используете аргумент auto_now
для DateTimeField
:
date = models.DateTimeField(auto_now=True)
См. документацию Django для DateTimeField.