通过字段名称映射访问Django模型字段

1 投票
3 回答
1024 浏览
提问于 2025-04-16 00:37

我是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

撰写回答