Django @staticmethod两个字段的总和

时间:2012-07-12 06:15:49

标签: python django

我有一个简单的问题。我正在尝试将字段添加到模型中,该模型是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

任何想法我做错了什么?

干杯

3 个答案:

答案 0 :(得分:5)

我认为你想为你的模型添加一个方法,这样https://docs.djangoproject.com/en/dev/topics/db/models/#model-methods可能对你有帮助。

@staticmethod是一个装饰器,它向class声明方法,那么差异是什么?

总而言之,静态方法没有任何特定对象的实例只是class对象的实例,class对象是什么意思,python函数中的大多数东西, class,当然对象实例实际上是对象......

就像所有人之前提到的那样@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)

虽然我们使用装饰器作为简写,但两种方法都非常相似。

希望这会有所帮助。

答案 1 :(得分:2)

从您与模型实例的交互方式来看,我相信您实际上想要使用@property装饰器。

答案 2 :(得分:0)

你需要通过将实例作为参数传递来调用它。

 total = model.fee_total(model)

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

然而,正如'FilipDupanović'建议您可能想要使用@property而不是@staticmethod