Наследование одного стола в Джанго - PullRequest
22 голосов
/ 27 октября 2008

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

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

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

Ответы [ 5 ]

16 голосов
/ 12 ноября 2009

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

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

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

15 голосов
/ 28 октября 2008

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

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

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

3 голосов
/ 11 апреля 2011

См. Мою попытку:

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

Эмуляция "таблица на иерархию" a.k.a. "наследование одной таблицы" в Django. Базовый класс должен содержать все поля. Его подклассам не разрешается содержать какие-либо дополнительные поля, и, оптимально, они должны быть прокси.

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

2 голосов
/ 02 февраля 2013

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

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

обновление: я полагаю, что вилка могла быть объединена обратно в

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

2 голосов
/ 05 марта 2010

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

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

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'

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

...