Проблемы даты и времени Django (default=datetime.now ())

Я имею ниже модели дб:

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

256
задан Shamanu4 13 May 2019 в 02:55
поделиться

4 ответа

похоже, что 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

547
ответ дан 23 November 2019 в 02:44
поделиться

Из документации о поле по умолчанию модели django:

Значение по умолчанию для поля. Это может быть значение или вызываемый объект. Если вызываемый, он будет вызываться каждый раз при создании нового объекта.

Следовательно, должно работать следующее:

date = models.DateTimeField(default=datetime.now,blank=True)
26
ответ дан 23 November 2019 в 02:44
поделиться

Функция datetime.now() оценивается при создании класса, а не при добавлении новой записи в базу данных.

Чтобы добиться желаемого, определите это поле так:

date = models.DateTimeField(auto_now_add=True)

Таким образом, поле date будет устанавливаться в текущую дату для каждой новой записи.

9
ответ дан 23 November 2019 в 02:44
поделиться

Из справочника по языку Python, в разделе Определения функций:

Значения параметров по умолчанию оцениваются при выполнении определения функции. Это означает, что выражение оценивается один раз, когда функция определена, и это же "предварительно вычисленное" значение используется для каждого вызова.

К счастью, в Django есть способ сделать то, что вы хотите, если вы используете аргумент auto_now для DateTimeField:

date = models.DateTimeField(auto_now=True)

См. документацию Django для DateTimeField.

5
ответ дан 23 November 2019 в 02:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: