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

时间:2009-10-26 17:30:45

标签: python django django-models oop

每个Django模型都有一个自动创建的默认主键id。我希望模型对象具有另一个属性big_id,其计算方式如下:
big_id = id * SOME_CONSTANT

我希望big_id作为model_obj.big_id访问,而没有相应的数据库表,其中包含名为big_id的列。

这可能吗?

3 个答案:

答案 0 :(得分: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 :(得分: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)  

答案 2 :(得分:0)

你现在有两个我能想到的选择:

  1. 由于您不希望数据库中的字段,最好的办法是在模型上定义一个返回self.id * SOME_CONSTANT的方法,比如你称之为big_id()。您可以随时以yourObj.big_id()方式访问此方法,并且它将作为yourObj.big_id在模板中提供(您可能希望阅读django模板中的“魔术点”)。
  2. 如果您不介意它在数据库中,您可以覆盖对象的save方法来计算id * SOME_CONSTANT并将其存储在big_id字段中。这样可以避免每次都计算它,因为我假设ID不会改变