想在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正确保存
答案 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_kilometer
和ending_kilometer
声明字段或为其分配值。所以错误抱怨对NoneType
值的操作:
if not self.total_kilometer:
self.total_kilometer = self.ending_kilometer - self.starting_kilometer