// Aggiornamento
Il commento sotto il post originale mi ha fatto pensare. Credo che questa sia la soluzione migliore finora:
from datetime import datetime, timedelta
class MyModel(models.Model):
mydate = models.DateTimeField(default=datetime.now()+timedelta(days=30))
// 2. Aggiornare
Se si desidera definire un attributo di modello che contiene la quantità di giorni che si dovrebbe essere aggiunto sarà necessario sovrascrivere il metodo di salvataggio. Finora non sono riuscito a trovare un modo più semplice.
Soluzione:
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()
Come becomingGuru già suggerito si dovrebbe ignorare i vostri modelli di risparmiare metodo.
Esempio:
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()
questo non è il modo migliore per me dal momento che è necessario salvare il modello due volte. Tuttavia, utilizzando auto_now_add è necessario salvare il modello prima di creare un'istanza datetime per mydate.
Un altro approccio che richiederebbe un solo risparmiare:
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()
Speranza che ha aiutato!
Questa è una supposizione, ma le forme Django consentono chiamate di funzione nelle loro '' valori iniziali =. Se questo è il caso anche per i modelli, puoi rimuovere auto_add_now e sostituirlo con 'default = lambda: datetime.now() + timedelta (days = 30)' –