Однозначное наследование в Django
Есть ли явная поддержка однонаправленного наследования в Django? Последнее, что я слышал, все еще находится в стадии разработки и обсуждения.
Существуют ли библиотеки/хаки, которые я могу использовать в то же время, чтобы зафиксировать основное поведение? У меня есть иерархия, которая смешивает разные объекты. Канонический пример структуры корпорации с классом Employee, подклассы для типов сотрудников и manager_id (parent_id) будут хорошим приближением к проблеме, которую я решаю.
В моем случае я хотел бы представить идею о том, что сотрудник может управлять другими сотрудниками при управлении другим сотрудником. Для Менеджера и Работника нет отдельных классов, что затрудняет их распространение по таблицам. Подклассы будут представлять типы сотрудников-программистов, бухгалтеров, продаж и т.д. И будут независимы от того, кто контролирует, кто (ОК, я думаю, это уже не типичная корпорация в некотором отношении).
Ответы
Ответ 1
В настоящее время существуют две формы наследования в Django - MTI (наследование модели модели) и ABC (абстрактные базовые классы).
Я написал учебник о том, что происходит под капотом.
Вы также можете ссылаться на официальные документы на наследование модели.
Ответ 2
Я думаю, что OP спрашивает об одностраничном наследовании как определенном здесь:
Реляционные базы данных не поддерживают наследование, поэтому при сопоставлении объектов с базами данных мы должны учитывать, как представлять наши красивые структуры наследования в реляционных таблицах. При сопоставлении с реляционной базой данных мы стараемся минимизировать соединения, которые могут быстро монтироваться при обработке структуры наследования в нескольких таблицах. Однозначное наследование отображает все поля всех классов структуры наследования в одну таблицу.
То есть, одна таблица базы данных для всей иерархии классов сущностей. Django не поддерживает такое наследование.
Ответ 3
Смотрите мою попытку:
http://djangosnippets.org/snippets/2408/
Эмуляция "таблицы на иерархию" a.k.a. "наследование одиночной таблицы" в Django. Базовый класс должен содержать все поля. В подклассах не разрешается содержать какие-либо дополнительные поля, и оптимально они должны быть прокси.
Не совсем "однонаправленное наследование таблицы", но достаточно близко для многих ситуаций.
Ответ 4
это может быть полезно: 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
Ответ 5
Я думаю, вы можете сделать что-то похожее на это.
Я должен сам реализовать решение этой проблемы, и вот как я ее решил:
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 обрабатывает это с моей головы. Кроме того, я действительно не тестировал вышеуказанный код, это строго для развлекательных целей, надеюсь, поставил вас на правильный путь.