Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 10, 2009 17:05:45

Vasilych
От:
Зарегистрирован: 2008-04-24
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

__unicode__ для parent table при multi-table inheritance

Ситуация следующая. Есть три модели:

class Party(models.Model):
address = models.TextField()


class Company(Party):
name = models.CharField(max_length=100)

def __unicode__(self):
return self.name


class Person(Party):
fname = models.CharField(max_length=100)
lname = models.CharField(max_length=100)
company = models.ForeignKey(Company, null=True, blank=True)

def __unicode__(self):
return "%s %s" % (self.lname, self.fname)
Нужно для модели Party определить метод __unicode__ , чтобы он отображал __unicode__ методы child классов.
В голову приходит следующая мысль

    def __unicode__(self):
try:
return self.company.__unicode__()
except:
return self.person.__unicode__()
Но это как то по дурацки :) Как можно сделать иначе?



Офлайн

#2 Авг. 10, 2009 19:25:11

Vasilych
От:
Зарегистрирован: 2008-04-24
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

__unicode__ для parent table при multi-table inheritance

Вот думаю, будет лучше.
Нужно добавить поле party_type, а в потомках переопределить метод save() чтобы сохранялся необходимый нам party_type.
Тогда __unicode__ становится логичнее.

class Party(models.Model):
address = models.TextField()
party_type = models.CharField(max_length='20')

def __unicode__(self):
if self.party_type == 'company':
return self.company.__unicode__()
elif self.party_type == 'person':
return self.person.__unicode__()

class Company(Party):
name = models.CharField(max_length=100)

def __unicode__(self):
return self.name

def save(self):
self.party_type = 'company'
super(Company, self).save()

class Person(Party):
fname = models.CharField(max_length=100)
lname = models.CharField(max_length=100)
company = models.ForeignKey(Company, null=True, blank=True)

def __unicode__(self):
return "%s %s" % (self.lname, self.fname)

def save(self):
self.party_type = 'person'
super(Person, self).save()



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version