Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django Custom Save Model

Tags:

python

django

I'm trying to perform a basic date calculation in a save model in django, see below code:

  class Purchase(models.Model):
    purchase_date = models.DateField()
    purchase_place = models.CharField(verbose_name='Place of Purchase', max_length=255)
    purchaseCategory = models.ForeignKey(PurchaseCategory, verbose_name='Purchase Category')
    cost = models.DecimalField(max_digits=11, decimal_places=2)
    warranty_period_number = models.IntegerField()
    warranty_period_type = models.CharField(max_length=255, choices=(('m', 'Month(s)'), ('y', 'Year(s)')))
    warranty_end_date = models.DateField(editable=False)
    scan = models.CharField(max_length=255)
    alerts = models.BooleanField(verbose_name='Receive Email Alerts?')
    user = models.ForeignKey('auth.User', editable=False)
    created = models.DateTimeField(editable=False, auto_now_add=True)
    modified = models.DateTimeField(editable=False, auto_now=True)

    #custom save model
    def save(self, *args, **kwargs):
        #figure out warranty end date
        if self.warranty_period_type == 'm':
            self.warranty_end_date = self.purchase_date + self.purchase_date.timedelta(months=self.warranty_period_number)
        else:
            self.warranty_end_date = self.purchase_date + self.purchase_date.timedelta(years=self.warranty_period_number)
        super(Purchase, self).save()

I thought the following would work but no luck.. it errors with:

'datetime.date' object has no attribute 'timedelta'

Can anyone point in the right direction to do what I'm trying to do?

Cheers, Ben

like image 886
Ben Kilah Avatar asked Mar 31 '12 05:03

Ben Kilah


1 Answers

timedelta doesnot accept years, so

from datetime import timedelta
# custom save model
def save(self, *args, **kwargs):
    # figure out warranty end date
    if self.warranty_period_type == 'm':
        self.warranty_end_date = self.purchase_date + timedelta(days=self.warranty_period_number*31)
    else:
        self.warranty_end_date = self.purchase_date + timedelta(days=self.warranty_period_number*365.2425)
    super(Purchase, self).save(*args, **kwargs)

Refs Python timedelta in years

like image 176
okm Avatar answered Oct 11 '22 21:10

okm