在Django模型/ Python类中创建派生属性的简单方法是什么?
每个Django模型都有一个默认的主键id
,这个主键是自动生成的。我想让模型对象有另一个属性big_id
,这个属性的计算方式是:
big_id = id * SOME_CONSTANT
我希望能像访问model_obj.big_id
这样来获取big_id
,而不需要在对应的数据库表中有一个叫big_id
的列。
这样做可以吗?
3 个回答
0
我现在想到你有两个选择:
- 如果你不想在数据库里存这个字段,最好的办法是在模型里定义一个方法,返回 self.id 乘以一个常量,比如你可以叫这个方法 big_id()。你可以随时通过 yourObj.big_id() 来访问这个方法,在模板里也可以用 yourObj.big_id(你可能想了解一下 Django 模板里的“魔法点”)。
- 如果你不介意把它存到数据库里,你可以重写对象的保存方法,计算 id 乘以一个常量,然后把结果存到 big_id 字段里。这样就不用每次都计算了,因为我想 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)
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的值,而不是每次访问时都去计算。