2008-10-27 2 views
19

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

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

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

+0

Вы можете использовать пакет третьей стороны, которая дает вам Single Table Inheritance: https://github.com/craigds/django-typed-models – guettli 2017-05-02 12:24:07

ответ

15

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

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

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

15

Я думаю, что ОП прошу о однотабличных Наследованиях в defined here:

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

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

+0

просто использовать одну таблицу, что невозможно в Джанго? – eugene 2013-10-14 05:19:01

+0

с использованием одной таблицы для нескольких моделей - это не поддерживается – 2013-10-30 11:25:17

1

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

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

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' 

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

3

Смотрите мою попытку:

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

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

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

2

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

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

обновления: Я считаю, что вилка может быть слита обратно в

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

Смежные вопросы