通过字段名称映射接近django模型字段

时间:2010-06-30 09:35:32

标签: python django django-models

Django新手在这里,

我有几种类型的模型,每种模型都有不同的名称(例如first_name,forename,prenom),我希望每个模型都包含一个映射,以便我可以使用一个模型轻松地接近每个字段常规名称(例如,所有字段名称的first_name)。这样做的好方法是什么?

3 个答案:

答案 0 :(得分:3)

我认为最好的方法是在模型中使用传统名称,并只提供一种明显的方式来访问它。如果您不想更改数据库列,则可以使用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"

如果您需要提供不同的方式来访问成员(我会尽量避免!),您仍然可以为每个模型添加属性。

答案 1 :(得分:2)

您可以在每个模型上定义@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

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