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)

静态方法不self作为实例参数隐式传递。

但是,正如 'Filip Dupanović' 建议的那样,您可能想要使用 @property 而不是 @staticmethod

于 2012-07-12T06:26:41.090 回答