Подтвердить что ты не робот

Однозначное наследование в Django

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

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

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

4b9b3361

Ответ 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 обрабатывает это с моей головы. Кроме того, я действительно не тестировал вышеуказанный код, это строго для развлекательных целей, надеюсь, поставил вас на правильный путь.