在Django Model/Python类中是否有一种简单的方法来创建派生属性?

4
每个Django模型都有一个默认的自动创建的主键id。我想让模型对象具有另一个属性big_id,其计算方式为:
big_id = id * SOME_CONSTANT 我希望能够以model_obj.big_id的形式访问big_id,而不需要相应的数据库表具有名为big_id的列。
这是可能的吗?
3个回答

8

嗯,Django模型实例只是Python对象,至少我是这样被告知的 :P

以下是我的做法:

class MyModel(models.Model):
    CONSTANT = 1234
    id = models.AutoField(primary_key=True) # not really needed, but hey

    @property
    def big_id(self):
        return self.pk * MyModel.CONSTANT

很显然,如果您尝试使用未保存的模型进行操作,将会出现异常。您还可以预先计算big_id值,而不是每次访问时都进行计算。

1
class Person(models.Model):
    x = 5
    name = ..
    email = ..
    def _get_y(self):
        if self.id:
            return x * self.id        
        return None
    y = property(_get_y)  

0

我目前能想到两个选项:

  1. 既然你不想在数据库中存储该字段,那么最好的方法是在模型上定义一个方法,返回self.id * SOME_CONSTANT,比如你可以称之为big_id()。你随时可以访问此方法,例如yourObj.big_id(),并且它将在模板中作为yourObj.big_id可用(你可能需要了解Django模板中的“魔法点”)。
  2. 如果你不介意它存在于数据库中,你可以覆盖对象上的save方法来计算id * SOME_CONSTANT并将其存储在big_id字段中。这将使你免于每次计算,因为我假设ID不会改变。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接