我有一个简单的问题。我正在尝试将字段添加到模型中,该模型是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
任何想法我做错了什么?
干杯
答案 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