6

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

例えば:

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

モデル内に @staticmethod を追加するだけでよいと思いました。

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

しかし、次を使用してモデルの「fee_total」フィールドにアクセスできないようです。

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

私が間違っていることはありますか?

乾杯

4

3 に答える 3

6

モデルにメソッドを追加して、このhttps://docs.djangoproject.com/en/dev/topics/db/models/#model-methodsが役立つと思います。

@staticmethodにメソッドを宣言するデコレータですがclass、違いは何ですか?

簡単に言えば、静的メソッドには特定のオブジェクトへのインスタンスはなく、オブジェクトへのインスタンスだけです。classオブジェクトとはどういう意味classですか。関数、クラスなどのPythonのほとんどのもの、そしてもちろんオブジェクトのインスタンスは実際にはオブジェクトです。 。

誰もが前に述べたように@property、メソッドを変数として機能させるデコレータです...したがって、明示的に使用する必要はありません()

いずれにせよ、あなたはこれをしたいと思うでしょう:

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

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

ドキュメントはより長いアプローチを取りますが:

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)

デコレータを省略形として使用しますが、どちらの方法もほぼ同じです。

お役に立てれば。

于 2012-07-12T06:36:47.127 に答える
2

モデル インスタンスとやり取りする方法から、代わりに@propertyデコレータを実際に使用したいと考えています。

于 2012-07-12T06:23:33.083 に答える
0

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

 total = model.fee_total(model)

selfstaticメソッドは、インスタンスパラメータとして暗黙的に渡されません。

ただし、「FilipDupanović」が示唆しているように、@staticmethodの代わりに@propertyを使用することをお勧めします

于 2012-07-12T06:26:41.090 に答える