Любое поле с установленным атрибутом auto_now
также будет наследовать editable=False
и, следовательно, не будет отображаться в панели администратора. В прошлом говорили о том, что аргументы auto_now
и auto_now_add
исчезнут, и хотя они все еще существуют, я чувствую, что вам лучше использовать custom 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
в лучшем случае ненадежны.