Поддерживает ли Django классы моделей, наследуемые от многих неабстрактных моделей? - PullRequest
1 голос
/ 16 декабря 2009

Допустим, у меня есть три класса моделей django - давайте назовем их A, B и C. Если A и B абстрактные, я могу сделать что-то вроде:

class C(A,B):
    pass

Что если они не абстрактные, а я делаю то же самое? Будет ли все еще работать правильно или нет? Или я неправильно понял, и этого не следует делать с абстрактными моделями?

У меня есть некоторые проблемы, которые я связываю с тем, что ответ, вероятно, нет, но я все же предпочел бы убедиться в этом, если кто-нибудь знает :) Конкретный вариант использования, который у меня был для этого, вероятно, лучше обслуживать Родовые отношения (я только недавно обнаружил их существование), поэтому я думаю, что было бы понятно, если бы команда Django приняла такое дизайнерское решение (я могу не вижу много людей, нуждающихся в этом). Я просто хотел бы знать наверняка, в чем дело.

Редактировать 1 (после ответа Доминика)

Интересно ... Проблема, с которой мы сталкиваемся, - это структура, похожая на IMDb (я думаю, что IMDb немного легче понять, чем предмет, который у нас есть на самом деле, поэтому я буду использовать их в качестве примера). На IMDb есть страницы для людей и страницы для фильмов, а у людей и фильмов есть собственные доски объявлений.

Мы закончили тем, что подключили доски объявлений к людям и фильмам, создав модель MessageboardOwner (с одним атрибутом - идентификатором, автоматически добавленным Django), который «владеет» доской объявлений, а люди и фильмы наследуют ее. Проблема в том, что наш класс "People" также наследуется от двух других классов. Определение класса выглядит примерно так:

class Person(A,B,MessageboardOwner):

Первоначально это, казалось, работало нормально, но сегодня произошло нечто довольно странное ... Я удалял Персона в админке, и админ спросил: "Вы уверены?" вопрос и показывал мне, какие еще объекты он должен будет удалить. Он пытался удалить две доски объявлений, а не одну. Одна из этих досок объявлений должна была принадлежать фильму, а не человеку.

Посмотрев, что именно было в базе данных, я обнаружил, что этот экземпляр Person использует тот же экземпляр MessageboardOwner, что и Movie. Когда я поиграл с этим, получилось, что класс Movie, унаследованный только после MessageboardOwner, вроде бы работал нормально. Однако при сохранении Person объект MessageboardOwner создавался только в том случае, если он еще не существует (или, возможно, перезаписал существующий - я не уверен). Я также обнаружил, что поля id, унаследованные от A, B и MessageboardOwner, всегда были одинаковыми, что мне показалось странным.

1 Ответ

2 голосов
/ 16 декабря 2009

Да, вы можете использовать обычное множественное наследование Python с моделями. Имейте в виду это предупреждение, хотя:

Так же, как с подклассами Python, для модели Django возможно наследовать от нескольких родительских моделей. Имейте в виду, что нормальное имя Python правила разрешения применяются. Первая база класс это конкретное имя (например, Мета) появляется в том, что используется; например, это означает, что если несколько родителей содержат мета класс, только первый собирается будет использоваться, а все остальные будут игнорироваться.

Как правило, вам не нужно наследовать от нескольких родителей. Главный сценарий использования, где это полезно для «смешанные» классы: добавление определенного дополнительное поле или метод для каждого класса который наследует смешивание. Попробуй сохранить ваши иерархии наследования как простые и просто, насколько это возможно, так что вам не придется бороться с выяснить, где конкретный кусок информация поступает с.

Из документов Django .

Как правило, множественное наследование - плохая идея, и существуют более простые способы сделать что-то Если вы уточните, какую проблему вы пытаетесь решить более четко, мы могли бы помочь немного лучше.

...