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

Python 通过字段名映射接近django模型字段,python,django,django-models,Python,Django,Django Models,这里是Django新手 我有几种类型的模型,每种模型中的字段都有不同的名称(例如,first_name、forename、prenom),我希望每个模型都包含一个映射,以便我可以使用一个常规名称(例如,所有字段名的first_name)轻松接近每个字段。这样做的好方法是什么?您可以让所有模型都继承一个新模型,该模型定义了一个属性函数来获取/设置正确的变量 class BaseNameClass(models.Model) def getfname(self): if h

这里是Django新手


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

您可以让所有模型都继承一个新模型,该模型定义了一个
属性
函数来获取/设置正确的变量

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

您可以使所有模型都继承一个新模型,该模型定义了一个
属性
函数来获取/设置正确的变量

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
您可以在每个模型上定义一个,如下所示:

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
然后,您可以像这样引用新属性:

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
您可以在每个模型上定义一个,如下所示:

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
然后,您可以像这样引用新属性:

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

我认为最好的方法是在模型中使用传统名称,并且只提供一种显而易见的访问方式。如果不希望也更改数据库列,则可以使用该选项。例如:

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"

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

我认为最好的方法是在模型中使用常规名称,并且只提供一种显而易见的访问方法。如果不希望也更改数据库列,则可以使用该选项。例如:

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"

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

您好,谢谢您的回答,但我正在寻找将驻留在特定模型本身中的内容,而不是主模型中的内容。。。这意味着每个模型都知道如何翻译名字。如果愿意,您可以在每个模型中转储此代码(当然没有类定义行)。。。我只是想如果你从一个中心类继承了它,你可以节省代码复制。是的,但从概念上来说,每个模型都应该知道它唯一的字段名,因此你可以添加和删除模型,而无需更改基础模型。您好,谢谢您的回答,但我正在寻找一些将驻留在特定模型本身中的东西,不是主模型。。。这意味着每个模型都知道如何翻译名字。如果愿意,您可以在每个模型中转储此代码(当然没有类定义行)。。。我只是想如果你从一个中心类继承了它,你可以节省代码复制的时间。是的,但从概念上来说,每个模型都应该知道它唯一的字段名,这样你就可以在不更改基础模型的情况下添加和删除模型。回答得好,但我仍然需要不同的方法来访问成员。回答得好,但我仍然需要不同的方式来访问成员。