Любое поле с установленным auto_now
атрибутом также будет наследоваться editable=False
и, следовательно, не будет отображаться в панели администратора. В прошлом были разговоры о том, чтобы аргументы auto_now
и auto_now_add
исчезли, и, хотя они все еще существуют, я чувствую, что вам лучше использовать собственный save()
метод .
Поэтому для правильной работы я бы рекомендовал не использовать auto_now
или auto_now_add
вместо этого определять собственный save()
метод, чтобы убедиться, что created
он обновляется только в том случае, если id
он не установлен (например, при первом создании элемента), и обновлять его modified
каждый раз, когда элемент сохраняется
Я проделал то же самое с другими проектами, написанными мной с использованием Django, и вы save()
выглядите так:
from django.utils import timezone
class User(models.Model):
created = models.DateTimeField(editable=False)
modified = models.DateTimeField()
def save(self, *args, **kwargs):
''' On save, update timestamps '''
if not self.id:
self.created = timezone.now()
self.modified = timezone.now()
return super(User, self).save(*args, **kwargs)
Надеюсь это поможет!
Редактировать в ответ на комментарии:
Причина, по которой я просто придерживаюсь перегрузки по save()
сравнению с этими аргументами поля, имеет две причины :
- Вышеупомянутые взлеты и падения с их надежностью. Эти аргументы в значительной степени зависят от того, как каждый тип базы данных, с которой Django знает, как взаимодействовать, обрабатывает поле отметки даты / времени, и, кажется, ломается и / или изменяется между каждым выпуском. (Который я полагаю, является стимулом для вызова, чтобы удалить их полностью).
- Тот факт, что они работают только с DateField, DateTimeField и TimeField, и с помощью этого метода вы можете автоматически заполнять поля любого типа каждый раз, когда элемент сохраняется.
- Используйте
django.utils.timezone.now()
против datetime.datetime.now()
, потому что он будет возвращать TZ-осведомленный или наивный datetime.datetime
объект в зависимости от settings.USE_TZ
.
Чтобы выяснить, почему ОП увидел ошибку, я точно не знаю, но похоже, что created
она даже не заполняется вообще, несмотря на то, что имеет auto_now_add=True
. Для меня это выделяется как ошибка, и подчеркивает пункт # 1 в моем маленьком списке выше: auto_now
и auto_now_add
в лучшем случае ненадежен.