【问题标题】:Django @staticmethod sum of two fieldsDjango @staticmethod 两个字段的总和
【发布时间】:2012-07-12 06:15:48
【问题描述】:

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

任何想法我做错了什么?

干杯

【问题讨论】:

  • 您是否尝试过 total = model.fee_total() 请注意您的代码中缺少“()”。

标签: python django


【解决方案1】:

我认为您想为模型添加一个方法,这样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)

尽管我们使用装饰器作为简写,这两种方法几乎是等价的。

希望这会有所帮助。

【讨论】:

  • 感谢大家的回复,这个是最清楚的。干杯!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

     total = model.fee_total(model)
    

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

    但是,正如“Filip Dupanović”所建议的,您可能希望使用@property 而不是@staticmethod

    【讨论】:

      猜你喜欢
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 2019-04-17
      • 2011-03-10
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多