在django admin模型保存方法中计算服务税

时间:2015-01-30 17:48:52

标签: python django

想在django admin save方法中计算服务税,但是会收到一个错误

class Invoice(models.Model):
   extra_charge = models.DecimalField(max_digits=10,decimal_places=3, null=True, blank=True)
   driver_allownce_charge = models.DecimalField(max_digits=10,decimal_places=3, null=True, blank=True)
   night_hault_charge = models.DecimalField(max_digits=10,decimal_places=3, null=True, blank=True)
   toll_and_parking = models.DecimalField(max_digits=10,decimal_places=3, null=True, blank=True)
   starting_kilometer=models.IntegerField(null=True, blank=True)
   ending_kilometer=models.IntegerField(null=True, blank=True)
   service_tax = models.DecimalField(max_digits=10,decimal_places=3, null=True, blank=True)
   grand_total = models.DecimalField(max_digits=10,decimal_places=3, null=True, blank=True)
   def save(self, *args, **kwargs):
        if not self.total_kilometer:
            self.total_kilometer = self.ending_kilometer - self.starting_kilometer
        if not self.grand_total:
            minivl  = self.extra_charge + self.driver_allownce_charge + self.night_hault_charge
            tax = minivl*4.444
            final_tax = tax/100
            print final_tax
            self.grand_total = self.extra_charge + self.driver_allownce_charge + self.night_hault_charge + self.toll_and_parking
        return super(Invoice, self).save(*args, **kwargs)

但是收到一个错误

unsupported operand type(s) for *: 'Decimal' and 'float

total_kilometer正确保存

2 个答案:

答案 0 :(得分:2)

我的猜测是,因为你有各种可空的字段,这就引起了问题。您需要检查值是否存在,否则优雅地处理它。

例如:

minivl  = self.extra_charge or 0 + self.driver_allownce_charge or 0 + self.night_hault_charge or 0

这样,如果self.extra_charge评估为None,请使用值0。请注意,您也可以在表单中处理此问题,或者提供默认值0。

编辑:

对于不支持的decimal和float类型的问题,错误消息非常明显。

只需将小数类型转换为float

示例:

float(self.night_hault_charge or 0) 

答案 1 :(得分:0)

错误是因为您没有为starting_kilometerending_kilometer声明字段或为其分配值。所以错误抱怨对NoneType值的操作:

    if not self.total_kilometer:
        self.total_kilometer = self.ending_kilometer - self.starting_kilometer