模型字段上的 Django 吸气剂

Anu*_*TBE 4 django django-models

我正在使用Django 2.x

我有一个像

class MyModel(models.Model):
    name = models.CharField()
    balance = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)

我想更改 GET 请求中的 balance 值而不更改数据库中的值。

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

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

    @property
    def balance(self):
        if balance:
           return balance
        return 0.15 * 50
Run Code Online (Sandbox Code Playgroud)

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

注意:字段应与ModelAdminDRF Serializer兼容

C14*_*14L 14

有两种方法。通过使用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
Run Code Online (Sandbox Code Playgroud)

使用前导_是“隐藏”(私有)字段的 Python 约定。

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

    def get_balance(self):
        if self.balance:
           return self.balance
        return 0.15 * 50
Run Code Online (Sandbox Code Playgroud)

  • 免责声明:无法使用第一种方法在 DRF 中使用序列化器使用余额来创建数据库条目 (2认同)