Как я могу определить полиморфную связь между моделями в Django? - PullRequest
12 голосов
/ 06 января 2009

Я работаю над приложением Django, которое содержит модель Offer. Экземпляр Offer содержит условия ценообразования и указывает на определение продукта. Модель продукта на самом деле представляет собой иерархию (у меня есть модель Television, модель Camcorder и т. Д.). Поэтому я хотел бы, чтобы модель Offer содержала полиморфную (или «общую») ассоциацию, указывающую на любой продукт.

На данный момент все, что я обнаружил, - это использование общих ассоциаций в приложении ContentTypes . Это может сработать, но я ищу альтернативы, если таковые имеются.

Спасибо за вашу помощь.

(одно решение на ответ, пожалуйста)

Ответы [ 5 ]

4 голосов
/ 24 января 2010

ContentTypes - правильный подход. Это связано с тем, что ForignKey может указывать только на один тип таблицы, поэтому вам нужно пройти через промежуточную таблицу и выполнить разделение в зависимости от типа.

То есть модели наследования для иерархии классов, но ContentType для внешних ключей.

3 голосов
/ 06 января 2009

Если вам нужно только указать «любой продукт», а не какую-либо модель, тогда решение состоит в том, чтобы иметь модель продукта, от которой наследуются все продукты (т. Е. Телевизор и видеокамера являются подклассами продукта), и указать модель предложения. иностранный ключ к продукту.

2 голосов
/ 03 марта 2011

Вы не можете сделать это в Джанго. Либо используйте общие отношения , либо приложение Django, которое добавляет эту функцию, например django_polymorphic .

1 голос
/ 21 мая 2013

Взгляните на django-polymorphic , это реализует эту функцию, а также использует ContentTypes для внутреннего использования.

0 голосов
/ 06 января 2009

Возможно, вы захотите взглянуть на наследование модели .

...