приближение к полям модели Django через отображение имени - PullRequest
1 голос
/ 30 июня 2010

Django newbie здесь,

У меня есть несколько типов моделей, в каждом из которых поля имеют разные имена (например, first_name, forename, prenom), и я хочу, чтобы каждая из моделей содержала отображение такЯ могу легко подойти к каждому из полей, используя одно условное имя (например, first_name для всех имен полей).какой хороший способ сделать это?

Ответы [ 3 ]

3 голосов
/ 30 июня 2010

Я думаю, что лучшим способом было бы использовать обычные имена в ваших моделях и предоставить только один очевидный способ доступа к ним.Если вы не хотите менять столбцы базы данных, вы можете использовать опцию 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"

Если вам нужно предоставить разные способы доступа к элементам (чего я бы постарался избежать!), Вы все равно можете добавить свойства к каждой модели.

2 голосов
/ 30 июня 2010

Вы можете определить @ 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
0 голосов
/ 30 июня 2010

Вы можете сделать так, чтобы все ваши модели наследовали новую модель, для которой определена функция 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, вы бы получили доступ к имени просто:1011 *

...