2012-03-31 18 views
6

Staram się wykonywać podstawowe obliczenia dat w modelu zapisać w Django, patrz poniżej kodu:Django niestandardowe Zapisz model

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

Myślałem następujące będzie działać, ale bez powodzenia .. to błędy z:

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

Czy ktoś może wskazać właściwy kierunek, aby zrobić to, co próbuję wykonać?

Cheers, Ben

+0

z datetime importowej timedelta –

Odpowiedz

13

timedelta doesnot akceptują lat, więc

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

+0

jakiś pomysł dlaczego miałbym dostać ten błąd: numeryczna pola przelewowy szczegółach: Pole o dokładności 11, skala 11 musi zaokrąglić do wartości bezwzględnej mniejszej niż 1. –

+0

@BenKilah Pole numeryczne z dokładnością 11 i skalą 11 powinno być mniejsze niż 1, sprawdź [Dokument PostgreSQL, którego zasada dotyczy także innych DB) (http://www.postgresql.org/docs/8.3/static/datatype-numeric.html#DATATYPE-NUMERIC-DECIMAL) – okm