Django getter在模型领域

问题描述 投票:0回答:2

我正在使用Django 2.x.

我有一个像这样的模特

class MyModel(models.Model):
    name = models.CharField()
    balance = models.IntegerField()

我想在不更改数据库中的值的情况下更改GET请求上的余额值。

就像它可能是@Property字段一样,模型看起来像

class MyModel(models.Model):
    name = models.CharField()
    balance = models.IntegerField()

    @property
    def balance(self):
        if balance:
           return balance
        return 0.15 * 50

但是不允许重新声明。我该如何解决这个问题?

注意:字段应与ModelAdmin和DRF Serializer兼容

django django-models
2个回答
1
投票

有两种方法。通过使用a getter/setter并隐藏实际的表字段。这将允许你像模型中的任何常规字段一样使用myobject.balance,使用myobject.balance = 123分配并从中读取print(myobject.balance)等。

class MyModel(models.Model):
    name = models.CharField()
    _balance = models.IntegerField()

    @property
    def balance(self):
        if self._balance:
           return self._balance
        return 0.15 * 50

    @balance.setter
    def balance(self, value):
        self._balance = value

使用领先的_是“隐藏”(私有)字段的Python惯例。

第二种也是更简单的方法是简单地使用get_balance()函数,而不是使用属性。

    def get_balance(self):
        if self.balance:
           return self.balance
        return 0.15 * 50

0
投票

模型方法名称不应与模型字段相同

class MyModel(models.Model):
    name = models.CharField()
    balance = models.IntegerField()

    @property
    def get_balance(self):
        if self.balance:
           return self.balance
        return 0.15 * 50

参考这个https://docs.djangoproject.com/en/2.1/topics/db/models/#model-methods

© www.soinside.com 2019 - 2024. All rights reserved.