-Поиск по дневнику

Поиск сообщений в Linux_Loader

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 20.04.2008
Записей: 743
Комментариев: 2542
Написано: 7716


Как добавить новое поле типа DateTimeField в Django

Понедельник, 10 Мая 2021 г. 14:19 + в цитатник

Ситуация: нужно добавить в модель Django два новых поля с датой и временем - created и last_modified. При чём дата создания (created) должна быть заполнена обязательно по логике здравого смысла, а дату модификации мы хотим изначально оставить пустой, чтобы, например, для новых страниц (записей, заметок, комментариев, чего угодно) выводилось примерно следующее:

Создано:  10.05.2021  в 13:40:28

Отредактировано: Никогда

Есть две проблемы. Первая. У нас на сайте уже есть страницы, при добавлении поля created оно окажется изначально пустым и мы получим ошибку. То есть старым записям нужно назначить некоторую дату. Единственный вариант, который я нашёл, сделать такое поле:

created = models.DateTimeField('Date of creation', default=timezone.now)

default=timezone.now обязательно без скобок. Если указать default=timezone.now(), полю будет назначена дата запуска сервера, и у всех новых страниц дата создания (как и время) будут одинаковыми. Если скобки не указать, метод будет вызываться при записи каждой новой строки в таблицу БД и вычислять текущее время.

А вот с полем last_modified другая проблема. Дата в него изначально не записывается, и мы получим ту же ошибку:

django.db.utils.IntegrityError: column "last_modified" contains null values

Есть два простых выхода:

last_modified = models.DateTimeField('Last modified', default=None, null=True, blank=True)

База данных позволит хранить пустые значения. Возможно, этот код будет работать без null=True, я не пробовал. Но без blank=True точно будут проблемы. 

Второй выход - всё же назначить дату по умолчанию как timezone.now, а при выводе на страницу проверять: если дата модификации совпадает с датой создания, выводить Отредактировано: Никогда.

P.S. подозреваю, что default=None во втором примере кода тоже ненужен)).


 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку