2012-07-30 3 views
0

Вот сгущенное пример того, что я пытаюсь сделать:Можно ли добавить 'сквозной' образ детской модели на Django?

class Entity(models.Model): 
    name = models.CharField(max_length=70) 

class Individual(models.Model): 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 

class BookingAgent(Entity) 
    staff = models.ManyToManyField(Individual, through='Role', related_name="employee") 

class Role(models.Model): 
    person = models.ForeignKey(Individual) 
    company = models.ForeignKey(Entity) 
    position = models.CharField(max_length=70) 

В принципе, у меня есть родительский класс под названием Entity, который хранит всю базовую информацию для компании, то есть адрес, и т.д. Я тогда есть BookingAgent, который является ребенком Entity. Когда я пытаюсь создать сквозные отношения на модели BookingAgent, это не сработает. Я получаю сообщение об ошибке:

'staff' is a manually-defined m2m relation through model Role, which does not have foreign keys to Individual and BookingAgent

Но он работает, когда сквозные отношения определены в модели Entity`.

Моя цель состоит в том, чтобы каждый Сущность имел список лиц, которые являются сотрудниками или членами. Кажется, я понимаю, почему он не работает, но я не могу найти элегантное решение.

Спасибо!

UPDATE: Чтобы уточнить, Entity не является абстрактным базовым классом, потому что будут какие-то лица, не являющиеся BookingAgents, ManagementCompanies, и т.д.

+0

* Технически *, нет ничего плохого в том, что у вас есть. Если 'BookingAgent' - это' Entity', вы можете сохранить его в любом 'ForeignKey', который принимает' Entity'. Однако, поскольку Django устанавливает API M2M, это не сработает. Для того, чтобы API функционировал должным образом, он должен присоединить связанных менеджеров к обеим сторонам отношений, то есть «Индивидуальный» и «Агент бронирования», но ваш код скорее приведет к добавлению связанных менеджеров в «Индивидуал» и «Сущность». Вы можете назвать это ошибкой, но я бы предположил, что разработчики Django отметят ее WONTFIX, если вы ее отправите. –

+0

Спасибо @ChrisPratt! Я искал менеджеров, но я все еще смущен тем, как я могу это решить. Не могли бы вы уточнить? –

+0

Дело в том, что я не думаю, что вы * можете * решить это. Для каждой конкретной связи вам понадобится использовать другую «сквозную» модель. –

ответ

0

Я думаю, что нужно изменить «RoleTest» на «Роль» и вы должны иметь внешний ключ BookingAgent, не Entity (и не должны Entity быть абстрактный базовый класс?)

class BookingAgent(Entity) 
    staff = models.ManyToManyField(Individual, through='Role', related_name="employee") 

class Role(models.Model): 
    person = models.ForeignKey(Individual) 
    company = models.ForeignKey(BookingAgent) 
+0

Спасибо! Опечатка «RoleTest» была только в моем вопросе. Я не могу иметь ключ foregin к «BookingAgent», потому что у меня также есть «ManagementCompany» и т. Д. Или я должен сделать отдельную модель «Роль» для каждого из них? –

+0

ouch. это не так просто. Вы можете сделать отдельную таблицу за каждым подклассом «Entity». В качестве альтернативы вы можете объединить все подклассы «Entity» и дать ему поле типа, которое было бы одним из «Агент бронирования», «Managment company» и т. Д. Или вы могли бы использовать типы контента Django для получения общих отношений от Role to любой модели. Наверное, никто из них не идеален. – scytale

+0

Спасибо за отзыв. Некоторые из моих подклассов имеют разные поля, поэтому вместо объединения их в «Entity» я собираюсь использовать маршрут Generic Relationship. Этот урок помог: [link] (http://blog.yawd.eu/2011/admin-site-widget-generic-relations-django/) –

Смежные вопросы