How can my django model DateField add 30 days to the provided value?
datefield, django, model
Solution
// Update
The comment under the original post got me thinking. I guess this is the best solution so far:
from datetime import datetime, timedelta
class MyModel(models.Model):
mydate = models.DateTimeField(default=datetime.now()+timedelta(days=30))
// 2. Update
If you want to define a model attribute which holds the amount of days that should be added you are going to need to override the save method. So far I could'nt come up with a simpler way.
Solution:
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()
As becomingGuru already suggested you should override your models save method.
Example:
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()
This is not the best way for me since you have to save the model twice. But using auto_now_add requires you to save the model first before a datetime instance for mydate is created.
Another approach which would require only one save:
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()
Hope that helped!
Problem
as the title suggests. I want to add 30 days to the `DateField` field. This is auto populated on creation of record using `auto_now_add=True` Any ideas how to go about doing this? Thanks