Django: полиморфные связи между базами данных

9 ноября 2010

Внезапно Винни-Пух остановился и нагнулся к земле.
— В чём дело? — спросил Пятачок.
— Очень странная вещь,- сказал медвежонок.- Теперь тут, кажется, стало два зверя. Вот к этому — Неизвестно Кому — подошёл другой — Неизвестно Кто, и они теперь гуляют вдвоём.

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

Проблема

Изначально в проекте, помимо прочих, было две таблицы: одна таблица, скажем, Статьи и другая таблица, скажем, Сообщения. Сообщение могло быть связано с какой-то Статьей, чтобы было понятно, о чем идет речь. В новой версии проекта было принято решение добавить еще одну таблицу – Продукты и расширить таблицу Сообщений так, чтобы можно было писать сообщения и про Продукты. То есть вместо простого Foreign Key из одной понятной таблицы нужно было сделать не то Conditional Foreign Key, не то Polymorphic Foreign Key на Неизвестно Какую Таблицу. Нужно заметить, что сообщение может относиться только к чему-то одному, оно не может быть одновременно про Статью и Продукт.
Читать дальше…