2012-07-12 11 views
5

私は簡単な質問があります。私は2つのフィールドの合計であるモデルにフィールドを追加しようとしています。例えばDjango @staticmethod 2つのフィールドの合計

@staticmethod 
def fee_total(self): 
    return self.fee + self.fee_gst 

しかし、私はモデルの「fee_total」フィールドにアクセスできないようです。

class MyModel(models.Model) 
     fee = models.DecimalField() 
     fee_gst = models.DecimalField() 

私はちょうどモデル内@staticmethodを追加すると考えていました使用:

model = MyModel.objects.get(pk=1) 
total = model.fee_total 

私は間違って何をしていますか?あなたがあなたのモデルインスタンスとの対話の方法から

乾杯

+0

あなたのコードに_total = model.fee_total()_ note '()'がありませんでしたか? – Rohan

答えて

5

の@property使用することをお勧めします示唆されているように。

@staticmethodは、方法をclassに宣言するデコレータですので、その違いは何ですか?

ストーリーの短い、静的メソッドは、特定のオブジェクトのインスタンスをclassオブジェクトに持っていません。オブジェクトの意味は、classというオブジェクト、関数、クラス、そしてもちろんのインスタンスのようなものです。 @propertyが変数としてメソッドの行為をすることができますデコレータである前に、誰もが言及している...ので、あなたが明示的に()

eitherwayを使用する必要はありません、あなたがしたいようなオブジェクトは、実際には...

オブジェクトされていますこれを行う:

我々は短期手としてデコレータを使用しても

class MyModel(models.Model) 
    fee = models.DecimalField() 
    fee_gst = models.DecimalField() 


    def _fee_total(self): 
     return self.fee + self.fee_gst 
    fee_total = property(_fee_total) 

両方の方法はかなり等価です:

はかかわらず、ドキュメントが長いアプローチを取ります。

これが役に立ちます。

+0

あなたのすべての返信をお寄せいただきありがとうございます、これは最もクリアされた..乾杯! –

2

を、私はあなたが実際に代わり@propertyデコレータを使用したいと考えています。

0

インスタンスを次のようにパラメータとして渡して呼び出す必要があります。

total = model.fee_total(model) 

静的メソッドは、インスタンスパラメータとして暗黙的にselfを渡しません。しかし

、「フィリップDupanovićは」あなたは私はあなたがこのhttps://docs.djangoproject.com/en/dev/topics/db/models/#model-methodsはあなたを助けるかもしれないので、あなたのモデルにメソッドを追加したいと思う代わりに@staticmethod

関連する問題