Форум сайта python.su
0
Здравствуйте!
Необходимо наследовать модель, при создании класса-потомка, устанавливать поля класса-родителя в определенное значение.
В Питоне все просто, но применительно к моделям все несколько иначе.
Например, имеем родительский класс Дерево и классы-потомки Дуб и Береза.
class Дерево(models.Model):
sample_value = models.IntegerField()
type = models.CharField(max_lenght = 10)
class Дуб(Дерево):
type = models.CharField('дуб')
class Береза(Дерево):
type = models.CharField('береза')
class Дуб(Дерево):
type = 'дуб'
Офлайн
0
А почему бы просто конструктор не переопределить?
Офлайн
0
Прошу ткнуть носом, как это сделать.
Пробовал так
class Береза(Дерево):
def __init__(self):
super.__init__()
self.type = 'безера'
Отредактировано (Июль 31, 2011 21:25:34)
Офлайн
0
а что, у нас Django уже на третьем питоне работает?
Во-первых, super(Береза, self).__init__(*args, **kwargs), во вторых, разве присваивание просто будет работать?
Я даже больше скажу, возможно, проще переопределить не конструктор, а метод save(). Ну как-то вроде
if not self.type: self.type = u"дуб"
Отредактировано (Авг. 1, 2011 11:50:29)
Офлайн
0
Присваивание в самом деле не работает.
Есть еще связанный вопрос.
В Джанго создаются экземпляры классов Береза и Дуб. Экземпляров класса Дерево не создается, он задуман как виртуальный класс.
При этом делая выборку по модели Дерево, получаю все имеющиеся экземпляры потомков.
все_деревья = Дерево.objects.all()
Офлайн
0
wildDAlex
Может, есть смысл указать для класса Дерево abstract=True? Хотя, зачем тогда вообще наследование, если разница между классами только в типе?
Офлайн
0
Ну я упростил пример, выкинув все не относящееся к вопросу, в реальности разница не только в типе, так же как и общих полей много.
В целом почитал буржуйские источники, превалирует мнение, что наследование в Джанго очень не очевидно и проблемно. Плюс реализовано посредством линкованных таблиц, негативно влияющих на производительности БД. abstract=True похоже решение, хотя там на самом деле все поля создаются в таблице потомка.
Офлайн
-1
Офлайн