Наследование одной таблицы в Django

есть ли явная поддержка наследования одной таблицы в Django? Последнее, что я слышал, эта функция все еще разрабатывалась и обсуждалась.

есть ли библиотеки / хаки, которые я могу использовать в то же время, чтобы захватить основное поведение? У меня есть иерархия, которая смешивает разные объекты. Канонический пример структуры корпорации с классом Employee, подклассами для типов сотрудников и manager_id (parent_id) был бы хорошим приближением проблемы, которую я решаю.

в моем случае я хотел бы представить идею о том, что сотрудник может управлять другими сотрудниками, находясь под управлением другого сотрудника. Для менеджера и работника нет отдельных классов, что затрудняет их распространение по таблицам. Подклассы будут представлять типы сотрудников-программистов, бухгалтеров, продаж и т. д. и будут независимы от того, кто контролирует кого (хорошо, я думаю, что это больше не типичная корпорация в некотором отношении).

5 ответов


в настоящее время существует две формы наследования в Django - MTI (наследование таблицы моделей) и ABC (абстрактные базовые классы).

Я написал учебник о том, что происходит под капотом.

вы также можете ссылаться на официальные документы модель наследования.


Я думаю, что OP спрашивает о наследовании одной таблицы как определено здесь:

реляционные базы данных не поддерживают наследование, поэтому при сопоставлении объектов с базами данных мы должны рассмотреть, как представить наши хорошие структуры наследования в реляционных таблицах. При сопоставлении с реляционной базой данных мы стараемся минимизировать соединения, которые могут быстро монтироваться при обработке структуры наследования в нескольких таблицах. Наследование одной таблицы сопоставляет все поля всех классов структуры наследования в одну таблицу.

то есть одна таблица базы данных для всей иерархии классов сущностей. Django не поддерживает такого рода наследование.


посмотреть мою попытку:

http://djangosnippets.org/snippets/2408/

эмуляция "таблицы на иерархию" a.к. a. "наследование одной таблицы" в Django. Базовый класс должен содержать все поля. Подклассы не должны содержать никаких дополнительных полей, и оптимально они должны быть прокси.

не совсем "наследование одной таблицы", но достаточно близко для многих ситуаций.


Это может быть полезно:https://github.com/craigds/django-typed-models Это выглядит как реализация наследования одной таблицы, но имеет ограничение, что подклассы не могут иметь дополнительных полей.

существует также вилка, которая решает проблему невозможности создания дополнительных полей: https://github.com/KrzysiekJ/django-typed-models

update: я считаю, что вилка, возможно, была объединена обратно в

вот недавнее обсуждение списка рассылки разработчика django о STI: https://groups.google.com/forum/#!msg/django-developers/-UOM8HNUnxg/6k34kopzerEJ


Я думаю, что вы можете сделать что-то похожее на это.

Я должен сам реализовать решение этой проблемы, и вот как я ее решил:

class Citrus(models.Model)
    how_acidic = models.PositiveIntegerField(max_value=100)
    skin_color = models.CharField()
    type = models.CharField()

class TangeloManager(models.Manager)
    def get_query_set(self):
        return super(TangeloManager, self).get_query_set().filter(type='Tangelo')

class Tangelo(models.Model)
    how_acidic = models.PositiveIntegerField(max_value=100)
    skin_color = models.CharField()
    type = models.CharField()
    objects = TangeloManager()
    class Meta:
        # 'appname' below is going to vary with the name of your app
        db_table = u'appname_citrus'

Это может иметь некоторые проблемы с блокировкой... Я не совсем уверен, как Джанго справляется с этим с моей головы. Кроме того, я действительно не тестировал вышеуказанный код, это строго для развлекательных целей, чтобы, надеюсь, поставить вас на правильный путь.