// Actualización
El comentario bajo el post original me hizo pensar. Creo que esta es la mejor solución hasta el momento:
from datetime import datetime, timedelta
class MyModel(models.Model):
mydate = models.DateTimeField(default=datetime.now()+timedelta(days=30))
// 2. Actualizar
Si desea definir un atributo modelo que mantiene la cantidad de días que se debe añadirse van a necesitar anular el método guardar. Hasta ahora no podría encontrar una forma más simple.
Solución:
class MyModel(models.Model):
mydate = models.DateTimeField(editable=False)
daysadded = models.IntegerField()
def save(self):
from datetime import datetime, timedelta
d = timedelta(days=self.daysadded)
if not self.id:
self.mydate = datetime.now() + d
super(MyModel, self).save()
Como ya se ha sugerido becomingGuru debe reemplazar sus modelos ahorran método.
Ejemplo:
class MyModel(models.Model):
mydate = models.DateTimeField(auto_now_add=True)
def save(self):
from datetime import timedelta
d = timedelta(days=30)
// only add 30 days if it's the first time the model is saved
if not self.id:
// not saving the model before adding the timedelta gave me errors
super(MyModel, self).save()
self.mydate += d
// final save
super(MyModel, self).save()
Esta no es la mejor manera para mí ya que hay que guardar el modelo dos veces. Pero el uso de auto_now_add requiere que guarde el modelo antes de crear una instancia de fecha y hora para mydate.
Otro enfoque que requeriría una sola ahorra:
class MyModel(models.Model):
mydate = models.DateTimeField(editable=False) // editable=False to hide in admin
def save(self):
from datetime import datetime, timedelta
d = timedelta(days=30)
// only add 30 days if it's the first time the model is saved
if not self.id:
self.mydate = datetime.now() + d
super(MyModel, self).save()
esperanza de que ayudó!
Esta es una suposición, pero las formas de Django permite llamadas a funciones en sus valores iniciales '' =. Si este es el caso también para los modelos, entonces podrías eliminar auto_add_now y reemplazarlo por 'default = lambda: datetime.now() + timedelta (days = 30)' –