2017-04-22 69 views
0

您好,我遇到了一個我認爲很簡單的問題。我有以下類:TypeError:不支持的操作數類型爲*:'PositiveIntegerField'和'int'

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

一種方法是你可以轉換'PositiveIntegerField'回'int':'nominal_power = INT(models.PositiveIntegerField())''module_nominal_power = INT(models.PositiveIntegerField()) ' –

+0

只需將它們轉換爲整數:'(int(a)* 1000)/ int(b)' –

回答

-1

此錯誤表示您試圖乘以(*)的對象類型是不同的對象,您不能將PositiveIntegerFieldint相乘。您將PositiveIntegerField對象與int對象混合在一起。通過在類中定義__mul__運算符重載方法,您可以使PositiveIntegerField出現在乘法表達式中,因此當帶有乘法表達式的PositiveIntegerField的實例出現時,Python會自動重載__mul__方法。在蟒蛇2.X __coerce__被調用時,不同類型的對象出現在這樣的表達式,以強制它們到一個共同的類型。不過,建議不要使用__coerce__

可以在數學運算中使用的一些類使用__int__返回一個整數,表示其值在需要的時候:

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

int(Num()) * 20 
+0

我的答案中有任何錯誤嗎?我看到了投票。 – direprobs

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

+0

我試過你的解決方案,但是當我嘗試在我的views.py **植物中調用no_modules = Plant.objects.filter(user = request.user)** ** total_no_modules = Plant.objects.filter(user = request。用戶).aggregate(sum = Sum('plants.no_modules'))**我得到**異常類型:FieldError ** – George

+0

@George您可以像使用模型字段一樣使用它。如果你想要,你可以將它定義爲'IntegerField'並在保存模型時賦值。 –

+0

我該怎麼做? – George

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) 
相關問題