2011-01-14 4 views
1

У меня есть приложение django, где я бы хотел определить взаимосвязь между двумя классами на базовом уровне. Он также имеет смысл для меня, чтобы определить отношения между детьми этих базовых классов - так что я получаю что-то вроде этого:Наследование и отношения Django Model

class BaseSummary(models.Model): 
    base_types... 

class BaseDetail(models.Model): 
    base_detail_types... 
    base_summary = models.ForeignKey('BaseSummary') 

class ChildSummary(BaseSummary): 
    child_summary_types... 

class ChildDetail(BaseDetail): 
    child_detail_type... 
    child_summary = models.ForeignKey('ChildSummary') 

Поддерживает ли Джанго это? и если он поддерживается, что-то вроде этого вызовет проблемы масштабируемости?

Спасибо!

ответ

5

Да, это поддерживается. Да, это может вызвать проблемы с производительностью. Вы должны прочитать пост Джейкоба на модели наследования: http://jacobian.org/writing/concrete-inheritance/

Начиная с версии 1.0, Джанго поддерживаемую модель наследования. Это аккуратная функция, и может пройти долгий путь к увеличению гибкости в ваших вариантах моделирования.

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

0

Поддерживается и не вызывает проблем с масштабируемостью. Мой совет, однако, в том, что вы относитесь только к классам Child (т. Е. Не создавайте ссылки на базовые классы и не создавайте их).

Классы базовой модели должны быть расширенными (как класс абстрактных классов на других языках).