2016-06-20 4 views
2

私はコストを含む私の資産を表す次のModelクラスを持っています。ノードModelFieldクラスを作成せずに、単一のフィールドの__str __()メソッドをオーバーライドするにはどうすればよいですか?

class Asset(models.Model): 
    name = models.CharField(max_length=64) 
    cost = models.DecimalField(max_digits=12, decimal_places=2, default=0.00) 

    def __str__(self): 
     return self.name 

Asset.cost__str__()メソッドをオーバーライドする方法はありますか?

私の目標は、整数のプロパティを保持しながら通貨記号を含むcostの出力を持つことです。

例:

obj.cost = 10.00 

print(obj.cost) # should return $10.00 
print(obj.cost + 10) # should still be possible 
        # and should return 20.00 (without currency symbol, 
        #       because it is a regular integer now) 
+0

'obj.cost'は単なる[' Decimal'](https://docs.python.org/3/library/decimal.html#decimal.Decimal)インスタンスです。組み込みの 'Decimal'クラスの' __str__'メソッドをオーバーライドすることはお勧めできません。ユーティリティ関数を使用して、小数点を通貨記号で印刷することができます。 – knbk

答えて

1

それは明らかにはできません。 __str__はクラスAssetに属するメソッドですが、object.costを印刷する場合は、フィールドcostの文字列表現を表示しようとしています。 __str__は、モデルAssetのオブジェクトの出力にのみ影響し、個々のフィールドには影響しません。

第二に、object.cost + 10はあなただけで2つの整数の加算の結果を印刷して、object.cost10を追加しませんが、あなたはとても__str__は何もできない、object.costに変数に結果を保存したり割り当てられませんでした。

これを行うにはutil関数が必要ですが、これは些細なことだと思います。この機能は、通貨を印刷する他の状況がない限り、クラスAssetにある必要があります。この場合、utilは独立した関数でなければなりません。

0

display_costのメソッドを定義して、前のドル記号が必要なときに呼び出すことができます。

def display_cost(self): 
    return "${amount}".format(amount=self.cost) 


obj.cost = 10.00 
obj.save() 
obj.display_cost() # >> "$10.00" 

それでもAsset.costフィールドを変更しますが、あなたが必要なときにそれをラップする機能を使用しないことにより、整数の性質を維持することと思いますこの方法です。

関連する問題