Jedes Feld mit dem auto_now
Attributsatz erbt ebenfalls editable=False
und wird daher nicht im Admin-Bereich angezeigt. Es hat in der Vergangenheit die Rede gewesen über die Herstellung auto_now
und auto_now_add
Argumente gehen weg, und obwohl sie noch existieren, fühle ich Sie besser dran , nur unter Verwendung eines kundenspezifischen save()
Verfahren .
Damit dies ordnungsgemäß funktioniert, würde ich empfehlen, keine auto_now
oder zu verwenden auto_now_add
und stattdessen Ihre eigene save()
Methode zu definieren , um sicherzustellen, dass diese created
nur aktualisiert wird, wenn sie id
nicht festgelegt ist (z. B. wenn das Element zum ersten Mal erstellt wird), und sie modified
jedes Mal aktualisieren zu lassen, wenn das Element erstellt wird ist gespeichert.
Ich habe genau das Gleiche mit anderen Projekten gemacht, die ich mit Django geschrieben habe, und so save()
würde Ihr aussehen:
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)
Hoffe das hilft!
Als Antwort auf Kommentare bearbeiten:
Der Grund, warum ich mich nur an Überladung save()
halte und mich nicht auf diese Feldargumente verlasse, ist zweierlei:
- Die oben genannten Höhen und Tiefen mit ihrer Zuverlässigkeit. Diese Argumente hängen stark von der Art und Weise ab, wie jeder Datenbanktyp, mit dem Django interagieren kann, ein Datums- / Zeitstempelfeld behandelt und zwischen den einzelnen Versionen zu brechen und / oder sich zu ändern scheint. (Was meiner Meinung nach der Anstoß für den Aufruf ist, sie insgesamt entfernen zu lassen).
- Die Tatsache, dass sie nur mit DateField, DateTimeField und TimeField funktionieren und mit dieser Technik können Sie jeden Feldtyp jedes Mal automatisch füllen, wenn ein Element gespeichert wird.
- Verwenden Sie
django.utils.timezone.now()
vs. datetime.datetime.now()
, da datetime.datetime
abhängig davon ein TZ-fähiges oder naives Objekt zurückgegeben wird settings.USE_TZ
.
Um zu klären, warum das OP den Fehler gesehen hat, weiß ich nicht genau, aber es sieht so aus, als wäre created
es überhaupt nicht besetzt auto_now_add=True
. Für mich ist es ein Fehler und unterstreicht Punkt 1 in meiner kleinen Liste oben: auto_now
und auto_now_add
sind bestenfalls schuppig.