Django @staticmethod两个字段的总和

Ben*_*lah 5 python django

我有一个快速的问题.我正在尝试将字段添加到模型中,该模型是2个字段的总和.

例如:

class MyModel(models.Model)
      fee = models.DecimalField()
      fee_gst = models.DecimalField()
Run Code Online (Sandbox Code Playgroud)

我想我可以在模型中添加@staticmethod:

@staticmethod
def fee_total(self):
     return self.fee + self.fee_gst
Run Code Online (Sandbox Code Playgroud)

但我似乎无法使用以下方法访问模型的"fee_total"字段:

model = MyModel.objects.get(pk=1)
total = model.fee_total
Run Code Online (Sandbox Code Playgroud)

我有什么想法我做错了吗?

干杯

Sam*_*lar 5

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

@staticmethod是一个装饰器,声明方法class,所以有什么区别?

总而言之,静态方法没有任何特定对象的实例只是classObject 的实例,我的意思是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 
Run Code Online (Sandbox Code Playgroud)

虽然文档需要更长的方法:

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)
Run Code Online (Sandbox Code Playgroud)

尽管我们使用装饰器作为简写方法,但这两种方法几乎相同.

希望这可以帮助.