2012-07-12 78 views
5

我有一个快速的问题。我试图添加一个字段到2个字段总和的模型。Django @staticmethod两个字段的总和

例如:

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 

任何想法我做错了什么?

干杯

+0

你有没有试过_total = model.fee_total()_注意在你的代码中缺少'()'。 – Rohan 2012-07-12 06:21:06

回答

5

我想你想的方法添加到您的模型,以便该https://docs.djangoproject.com/en/dev/topics/db/models/#model-methods可以帮助你@属性。

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

长话短说,静态方法没有任何特定对象的实例只是class对象的实例,我的意思是class对象,Python中的大部分东西像函数,类,当然还有对象实际上对象...

像其他人@property之前提到是装饰,让一个方法充当变量...所以你没有明确地使用()

eitherway,你会想这样做:

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) 

这两种方法是几乎等同虽然我们使用装饰作为短手。

希望这有助于。

+0

感谢所有你的回复家伙,这一个是最清楚的..干杯! – 2012-07-12 06:43:53

2

从你的模型实例的交互的方式,我相信你真的想使用@property装饰器。

0

您需要通过传递实例作为参数进行调用,如下所示。

total = model.fee_total(model) 

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

然而,随着“菲利普Dupanović”建议您可能需要使用的,而不是@staticmethod