2012-03-31 99 views
6

我试图执行在Django保存模型基本日期计算,请参见下面的代码:Django的自定义保存模型

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() 

我想下面的工作,但没有运气..它的错误:

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

任何人都可以指向正确的方向做我想做的事吗?

干杯, 本

+0

从日期时间进口timedelta – 2014-04-24 07:24:46

回答

13

timedelta多年平均值接受年,所以

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) 

参考文献Python timedelta in years

+0

任何想法,为什么我会得到这个错误:数值字段溢出 详细信息:精度为11,比例为11的字段必须舍入到小于1的绝对值。 – 2012-03-31 08:08:38

+0

@BenKilah精度为11和比例为11的数字字段应该小于大于1,请检查[PostgreSQL doc也适用于其他DB的原则](http://www.postgresql.org/docs/8.3/static/datatype-numeric.html#DATATYPE-NUMERIC-DECIMAL) – okm 2012-03-31 08:55:52