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





Возможно, вы захотите взглянуть на наследование модели.
Спасибо, но я не думаю, что это ответ. Мне нужно иметь что-то вроде: class Offer (models.Model): product = models.ForeignKey (Product) ... Где Product - это абстрактный класс, а фактический объект, на который имеется ссылка, является экземпляром конкретного подкласса. Любые идеи?
Если вам нужно указать только на «любой продукт», а не на какую-либо модель, тогда решение состоит в том, чтобы иметь модель продукта, от которой наследуются все продукты (т.е. телевидение и видеокамера являются подклассами продукта), и дать вашей модели предложения ForeignKey для Продукт.
Да, это общая идея, но если я сделаю только это, то у меня будет 2 недостатка: во-первых, я не могу использовать наследование нескольких таблиц, во-вторых, когда я перехожу от предложения к продукту, я получаю экземпляр продукта вместо Экземпляр видеокамеры (или другого конкретного класса).
Вы можете автоматически преобразовать экземпляр продукта в экземпляр (например) Camcorder, если вы сохраните FK в «дочернем» ContentType (Camcorder) во время создания. Больше обсуждения на groups.google.com/group/django-users/browse_thread/thread/…
Что вы имеете в виду, говоря «Я не могу использовать наследование нескольких таблиц»? Многотабличное наследование - это то, как Django реализует наследование от неабстрактных базовых классов (в отличие от Rails, который выполняет однотабличное наследование). Ваш выбор здесь - наследование или родовые отношения; другой серебряной пули нет.
ContentTypes - правильный подход. Это связано с тем, что ForignKey может указывать только на один тип таблицы, поэтому вам нужно пройти через промежуточную таблицу и выполнить разделение в зависимости от другого типа.
Итак, наследование модели для иерархии классов, а ContentType для внешних ключей.
Вы не можете этого сделать в Django. Либо используйте родовые отношения, либо приложение Django, которое добавляет эту функцию, например django_polymorphic.
Взгляните на джанго-полиморфный, он реализует эту функцию, а также использует ContentTypes внутри.
Я, конечно, согласен, но не могли бы вы сформулировать ответ, чтобы сделать его действительно полезным для того, кто его задает. Таким образом я могу поставить +1.