Lo que entendí en los atributos del campo de modelos de Django es
auto_now : actualiza el valor del campo a la hora y fecha actuales cada vez que se llama a Model.save().auto_now_add : actualiza el valor con la hora y la fecha de creación del registro. Mi pregunta es ¿qué pasa si un modelo archivado contiene tanto auto_now como auto_now_add establecidos en True? ¿Qué sucede en ese caso?
Estos campos están integrados en Django expresamente para este propósito: los campos auto_now se actualizan a la marca de tiempo actual cada vez que se guarda un objeto y, por lo tanto, son perfectos para rastrear cuándo se modificó por última vez un objeto, mientras que un campo auto_now_add se guarda como la marca de tiempo actual cuando se La fila se agrega por primera vez a la base de datos y, por lo tanto, es perfecta para rastrear cuándo se creó.
De acuerdo con la documentación de django, usar tanto auto_now como auto_now_add en los campos de su modelo como True dará como resultado un error porque ambos son mutuamente excluyentes.
Como dice la documentación oficial de Django:
auto_now , auto_now_add y default son mutuamente excluyentes y darán como resultado un error si se usan juntos
Si un archivo en un modelo contiene tanto auto_now como auto_now_add establecidos en True , se producirá un error como este:
ERRORES: appname.Model.field_name: (fields.Efield_number) Las opciones auto_now, auto_now_add y default son mutuamente excluyentes. Solo una de estas opciones puede estar presente.
auto_now tiene prioridad (obviamente, porque actualiza el campo cada vez, mientras que auto_now_add solo se actualiza en la creación). Aquí está el código para el método DateField.pre_save :
def pre_save(self, model_instance, add): if self.auto_now or (self.auto_now_add and add): value = datetime.date.today() setattr(model_instance, self.attname, value) return value else: return super().pre_save(model_instance, add) Como puede ver, si se establece auto_now o ambos auto_now_add y el objeto es nuevo, el campo recibirá el día actual.
Lo mismo para DateTimeField.pre_save :
def pre_save(self, model_instance, add): if self.auto_now or (self.auto_now_add and add): value = timezone.now() setattr(model_instance, self.attname, value) return value else: return super().pre_save(model_instance, add)