Найти - Пользователи
Полная версия: Наследование моделей
Начало » Django » Наследование моделей
1
wildDAlex
Здравствуйте!
Необходимо наследовать модель, при создании класса-потомка, устанавливать поля класса-родителя в определенное значение.
В Питоне все просто, но применительно к моделям все несколько иначе.
Например, имеем родительский класс Дерево и классы-потомки Дуб и Береза.
class Дерево(models.Model):
sample_value = models.IntegerField()
type = models.CharField(max_lenght = 10)

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

class Береза(Дерево):
type = models.CharField('береза')
Такое переопределение поля не будет работать, в виду того, что Джанго воспринимает классы потомки как единую сущность с классом-родителем, а в таблице не может быть два поля с одинаковым именем.
Как мне реализовать заполнение поле type родителя при создании экземпляра потомка?
class Дуб(Дерево):
type = 'дуб'
Так тоже не работает.
Enchantner
А почему бы просто конструктор не переопределить?
wildDAlex
Прошу ткнуть носом, как это сделать.
Пробовал так
class Береза(Дерево):
def __init__(self):
super.__init__()
self.type = 'безера'
Получаю сообщение - Exception Value: __init__() takes exactly 1 argument (17 given).
Enchantner
а что, у нас Django уже на третьем питоне работает?

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

Я даже больше скажу, возможно, проще переопределить не конструктор, а метод save(). Ну как-то вроде
if not self.type: self.type = u"дуб"
wildDAlex
Присваивание в самом деле не работает.
Есть еще связанный вопрос.
В Джанго создаются экземпляры классов Береза и Дуб. Экземпляров класса Дерево не создается, он задуман как виртуальный класс.
При этом делая выборку по модели Дерево, получаю все имеющиеся экземпляры потомков.
все_деревья = Дерево.objects.all()
Вопрос в том, есть ли возможность выяснить, к какому классу-потомку относится тот или иной экземпляр в выборке?
Собственно, не найдя способа, я и ввел в родительский класс поле type. Может быть есть более элегантный способ?
Enchantner
wildDAlex
Может, есть смысл указать для класса Дерево abstract=True? Хотя, зачем тогда вообще наследование, если разница между классами только в типе?
wildDAlex
Ну я упростил пример, выкинув все не относящееся к вопросу, в реальности разница не только в типе, так же как и общих полей много.
В целом почитал буржуйские источники, превалирует мнение, что наследование в Джанго очень не очевидно и проблемно. Плюс реализовано посредством линкованных таблиц, негативно влияющих на производительности БД. abstract=True похоже решение, хотя там на самом деле все поля создаются в таблице потомка.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB