Każde pole z auto_now
ustawionym atrybutem również odziedziczy editable=False
i dlatego nie pojawi się w panelu administracyjnym. W przeszłości mówiono o tym, aby argumenty auto_now
i auto_now_add
zniknęły, i chociaż nadal istnieją, uważam, że lepiej jest po prostu skorzystać z niestandardowej save()
metody .
Tak więc, aby to działało poprawnie, odradzam używanie auto_now
lub auto_now_add
zamiast tego zdefiniowanie własnej save()
metody, aby upewnić się, że created
jest aktualizowana tylko wtedy, gdy id
nie jest ustawiona (na przykład przy pierwszym tworzeniu elementu), i niech aktualizuje się za modified
każdym razem, gdy element jest zapisany.
Zrobiłem dokładnie to samo z innymi projektami, które napisałem przy użyciu Django, więc save()
wyglądałoby to tak:
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)
Mam nadzieję że to pomoże!
Edytuj w odpowiedzi na komentarze:
Powód, dla którego po prostu trzymam się przeciążenia save()
kontra poleganie na tych argumentach pola, jest dwojaki:
- Wspomniane wzloty i upadki z ich niezawodnością. Argumenty te są bardzo zależne od sposobu, w jaki każdy typ bazy danych, z którym Django wie, jak wchodzić w interakcje, traktuje pole znacznika daty / godziny i wydaje się, że ulega uszkodzeniu i / lub zmianie między poszczególnymi wersjami. (Uważam, że jest to impuls do wezwania do całkowitego ich usunięcia).
- Fakt, że działają one tylko na DateField, DateTimeField i TimeField, a dzięki tej technice możesz automatycznie wypełniać dowolny typ pola za każdym razem, gdy element jest zapisywany.
- Użyj
django.utils.timezone.now()
vs. datetime.datetime.now()
, ponieważ w datetime.datetime
zależności od tego zwróci obiekt rozpoznający TZ lub naiwny settings.USE_TZ
.
Aby odpowiedzieć na pytanie, dlaczego OP widział błąd, nie wiem dokładnie, ale wygląda na to, że created
nawet nie jest w ogóle zaludniony, pomimo tego auto_now_add=True
. Dla mnie wyróżnia się to jako błąd i podkreśla pozycję nr 1 na mojej małej liście powyżej: auto_now
i auto_now_add
jest w najlepszym razie niestabilna.