TypeError:*支持的操作数类型*:'PositiveIntegerField'和'int'

时间:2017-04-22 19:31:26

标签: python django-models

你好我遇到了一个我觉得非常简单的问题。我有以下课程:

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'

我该如何解决这个问题?

3 个答案:

答案 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 

专业提示:您可以在计算中使用整数除法//,并避免调用inta * 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)

此错误表示您尝试乘以的对象类型(*)是不同的对象,您不能将PositiveIntegerFieldint相乘。您将PositiveIntegerField对象与int对象混合在一起。您可以通过在类中定义PositiveIntegerField运算符重载方法使__mul__出现在乘法表达式中,这样当PositiveIntegerField的实例出现乘法表达式时,Python会自动重载__mul__方法。在python 2.X中__coerce__在不同类型的对象出现在这样的表达式中时被调用,以便将它们强制转换为公共类型。但是,不推荐使用__coerce__

可能在数学运算中使用的某些类使用__int__在需要时返回表示其值的整数:

class Num:
    def __int__(self):
        return self.value

int(Num()) * 20