你好我遇到了一个我觉得非常简单的问题。我有以下课程:
class Plant(models.Model):
nominal_power = models.PositiveIntegerField()
module_nominal_power= models.PositiveIntegerField()
def calculation_of_components(a, b):
return int((a*1000)/b)
no_modules=calculation_of_components(nominal_power,module_nominal_power)
我收到错误:
TypeError: unsupported operand type(s) for *: 'PositiveIntegerField' and 'int'
我该如何解决这个问题?
答案 0 :(得分:0)
问题是你在模型类的创建时调用calculation_of_components
,当字段还没有取任何值时。
您可以通过no_modules
property
来解决此问题,以便在创建模型类时不会调用calculation_of_components
,而字段没有值:
class Plant(models.Model):
nominal_power = models.PositiveIntegerField()
module_nominal_power = models.PositiveIntegerField()
def calculation_of_components(self, a, b):
return int((a*1000)/b)
@property
def no_modules(self):
return self.calculation_of_components(self.nominal_power, self.module_nominal_power)
然后,您可以像常规模型字段一样访问no_modules
:
plnt = Plant(...)
plnt.no_modules
专业提示:您可以在计算中使用整数除法//
,并避免调用int
:a * 1000 // b
答案 1 :(得分:0)
首先:calculation_of_components
是类的静态方法。
在您的代码中,no_modules
是函数calculation_of_components
的结果。可能你需要一个功能:
class Plant(models.Model):
nominal_power = models.PositiveIntegerField()
module_nominal_power= models.PositiveIntegerField()
@staticmethod
def calculation_of_components(a, b):
return int((a*1000)/b)
def no_modules(self):
return self.calculation_of_components(self.nominal_power, self.module_nominal_power)
答案 2 :(得分:-1)
此错误表示您尝试乘以的对象类型(*)是不同的对象,您不能将PositiveIntegerField
与int
相乘。您将PositiveIntegerField
对象与int
对象混合在一起。您可以通过在类中定义PositiveIntegerField
运算符重载方法使__mul__
出现在乘法表达式中,这样当PositiveIntegerField
的实例出现乘法表达式时,Python会自动重载__mul__
方法。在python 2.X中__coerce__
在不同类型的对象出现在这样的表达式中时被调用,以便将它们强制转换为公共类型。但是,不推荐使用__coerce__
。
可能在数学运算中使用的某些类使用__int__
在需要时返回表示其值的整数:
class Num:
def __int__(self):
return self.value
int(Num()) * 20