Наследование модели Django и отношения - PullRequest
1 голос
/ 14 января 2011

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

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')

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

Спасибо!

Ответы [ 2 ]

5 голосов
/ 14 января 2011

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

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

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

0 голосов
/ 14 января 2011

Поддерживается и не вызывает проблем с масштабируемостью.Однако я советую вам ссылаться только на классы Child (т.е. не создавать ссылки на базовые классы и не создавать их экземпляры).

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

...