Уведомления

Группа в Telegram: @pythonsu

#1 Июль 29, 2011 15:23:55

wildDAlex
От:
Зарегистрирован: 2010-09-23
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование моделей

Здравствуйте!
Необходимо наследовать модель, при создании класса-потомка, устанавливать поля класса-родителя в определенное значение.
В Питоне все просто, но применительно к моделям все несколько иначе.
Например, имеем родительский класс Дерево и классы-потомки Дуб и Береза.

class Дерево(models.Model):
sample_value = models.IntegerField()
type = models.CharField(max_lenght = 10)

class Дуб(Дерево):
type = models.CharField('дуб')

class Береза(Дерево):
type = models.CharField('береза')
Такое переопределение поля не будет работать, в виду того, что Джанго воспринимает классы потомки как единую сущность с классом-родителем, а в таблице не может быть два поля с одинаковым именем.
Как мне реализовать заполнение поле type родителя при создании экземпляра потомка?
class Дуб(Дерево):
type = 'дуб'
Так тоже не работает.



Офлайн

#2 Июль 29, 2011 21:04:55

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование моделей

А почему бы просто конструктор не переопределить?



Офлайн

#3 Июль 31, 2011 21:25:07

wildDAlex
От:
Зарегистрирован: 2010-09-23
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование моделей

Прошу ткнуть носом, как это сделать.
Пробовал так

class Береза(Дерево):
def __init__(self):
super.__init__()
self.type = 'безера'
Получаю сообщение - Exception Value: __init__() takes exactly 1 argument (17 given).



Отредактировано (Июль 31, 2011 21:25:34)

Офлайн

#4 Авг. 1, 2011 11:40:46

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование моделей

а что, у нас Django уже на третьем питоне работает?

Во-первых, super(Береза, self).__init__(*args, **kwargs), во вторых, разве присваивание просто будет работать?

Я даже больше скажу, возможно, проще переопределить не конструктор, а метод save(). Ну как-то вроде

if not self.type: self.type = u"дуб"



Отредактировано (Авг. 1, 2011 11:50:29)

Офлайн

#5 Авг. 1, 2011 14:42:39

wildDAlex
От:
Зарегистрирован: 2010-09-23
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование моделей

Присваивание в самом деле не работает.
Есть еще связанный вопрос.
В Джанго создаются экземпляры классов Береза и Дуб. Экземпляров класса Дерево не создается, он задуман как виртуальный класс.
При этом делая выборку по модели Дерево, получаю все имеющиеся экземпляры потомков.

все_деревья = Дерево.objects.all()
Вопрос в том, есть ли возможность выяснить, к какому классу-потомку относится тот или иной экземпляр в выборке?
Собственно, не найдя способа, я и ввел в родительский класс поле type. Может быть есть более элегантный способ?



Офлайн

#6 Авг. 1, 2011 17:02:16

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование моделей

wildDAlex
Может, есть смысл указать для класса Дерево abstract=True? Хотя, зачем тогда вообще наследование, если разница между классами только в типе?



Офлайн

#7 Авг. 1, 2011 18:41:46

wildDAlex
От:
Зарегистрирован: 2010-09-23
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование моделей

Ну я упростил пример, выкинув все не относящееся к вопросу, в реальности разница не только в типе, так же как и общих полей много.
В целом почитал буржуйские источники, превалирует мнение, что наследование в Джанго очень не очевидно и проблемно. Плюс реализовано посредством линкованных таблиц, негативно влияющих на производительности БД. abstract=True похоже решение, хотя там на самом деле все поля создаются в таблице потомка.



Офлайн

#8 Авг. 5, 2011 10:35:02

mindinpanic
От:
Зарегистрирован: 2011-07-16
Сообщения: 8
Репутация: +  -1  -
Профиль   Отправить e-mail  

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version