Cualquier campo con el auto_now
conjunto de atributos también heredará editable=False
y, por lo tanto, no aparecerá en el panel de administración. Se ha hablado en el pasado sobre hacer que los argumentos auto_now
y auto_now_add
desaparezcan, y aunque todavía existen, creo que es mejor que solo use un método personalizadosave()
.
Por lo tanto, para que esto funcione correctamente, recomendaría no usar auto_now
o auto_now_add
y, en su lugar, definir su propio save()
método para asegurarse de que created
solo se actualice si id
no está configurado (como cuando se creó el elemento por primera vez), y que se actualice modified
cada vez que el elemento está guardado
He hecho exactamente lo mismo con otros proyectos que he escrito usando Django, y así save()
se vería así:
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)
¡Espero que esto ayude!
Editar en respuesta a los comentarios:
La razón por la que me quedo con la sobrecarga en lugar de save()
depender de estos argumentos de campo es doble:
- Los altibajos mencionados anteriormente con su fiabilidad. Estos argumentos dependen en gran medida de la forma en que cada tipo de base de datos con la que Django sabe interactuar trata un campo de marca de fecha / hora, y parece romperse y / o cambiar entre cada lanzamiento. (Lo que creo es el ímpetu detrás de la llamada para que se eliminen por completo).
- El hecho de que solo funcionan en DateField, DateTimeField y TimeField, y al usar esta técnica, puede completar automáticamente cualquier tipo de campo cada vez que se guarda un elemento.
- Use
django.utils.timezone.now()
vs. datetime.datetime.now()
, porque devolverá un datetime.datetime
objeto ingenuo o consciente de TZ dependiendo de settings.USE_TZ
.
Para abordar por qué el OP vio el error, no sé exactamente, pero parece que created
ni siquiera se está poblando, a pesar de haberlo hecho auto_now_add=True
. Para mí, se destaca como un error y subraya el elemento n. ° 1 en mi pequeña lista anterior: auto_now
y auto_now_add
en el mejor de los casos es escamoso.