通过字段名称映射访问Django模型字段
我是Django的新手,
我有几种不同类型的模型,每种模型里的字段名字都不一样(比如,有的叫first_name,有的叫forename,还有的叫prenom)。我想让每个模型都有一个映射,这样我就可以用一个统一的名字(比如都用first_name)来方便地访问这些字段。请问有什么好的方法可以做到这一点呢?
3 个回答
0
你可以让你的所有模型都继承一个新的模型,这个模型里面定义了一个 property
函数,用来获取或设置正确的变量。
class BaseNameClass(models.Model)
def getfname(self):
if hasattr(self, 'first_name'): return self.first_name
if hasattr(self, 'prenom'): return self.prenom
if hasattr(self, 'forename'): return self.forename
def setfname(self, x):
if hasattr(self, 'first_name'): self.first_name = x
if hasattr(self, 'prenom'): self.prenom = x
if hasattr(self, 'forename'): self.forename = x
firstname = property(getfname, setfname)
然后把你的模型都改成从这个新模型继承。这样做会稍微慢一点,但我们说的是纳秒和毫秒的差别。
如果你有一个叫 person
的子对象,你可以简单地通过以下方式来访问名字:
print person.firstname
person.firstname = "oli"
print person.firstname
4
我觉得最好的办法是给你的模型使用常规的名称,并且只提供一种明显的访问方式。如果你不想改变数据库的列名,你可以使用db_column这个选项。举个例子:
class Person(models.Model):
first_name = models.CharField(max_length=255, db_column='prenom')
class Customer(models.Model):
first_name = models.CharField(max_length=255, db_column='forename')
class Worker(models.Model):
first_name = models.CharField(max_length=255) # column is also called "first_name"
如果你需要提供不同的方式来访问成员(我会尽量避免这样做!),你仍然可以给每个模型添加属性。
3
你可以在每个模型上定义一个 @property,像这样:
class Personage(models.Model):
prenom = models.CharField(max_length=255)
@property
def first_name(self):
return self.prenom
然后你就可以像这样使用你新定义的属性:
personage = Personage.objects.all()[0]
personage.first_name