Мы сделали это довольно широко в наших приложениях с MySQL для работы с единственным ограничением базы данных Django. Наше приложение имеет пару баз данных, работающих в одном экземпляре MySQL. Мы можем добиться, чтобы модель кросс-базы данных объединялась таким образом, пока мы создали представления для каждой таблицы в «текущей» базе данных.
Что касается вложений/обновлений в представлениях, то в наших прецедентах вид в основном представляет собой «select * from [db.table];». Другими словами, мы не делаем никаких сложных объединений или фильтрации, поэтому триггер insert/updates из save() работает просто отлично. Если ваш случай использования требует таких сложных объединений или расширенной фильтрации, я подозреваю, что у вас не будет проблем с сценариями только для чтения, но может возникнуть проблема с вставкой/обновлением. Я думаю, что в MySQL существуют некоторые основные ограничения, которые препятствуют обновлению представлений, которые пересекают таблицы, имеют сложные фильтры и т. Д.
В любом случае, ваш пробег может отличаться, если вы используете РСУБД, отличную от MySQL, но Django doesn ' t действительно заботится, если он сидит поверх физического стола или вида. Это будет РСУБД, которая определяет, работает ли она на самом деле, как вы ожидаете. Как отметил предыдущий комментатор, вы, скорее всего, выбросите syncdb из окна, хотя мы успешно работали вокруг него с помощью сигнала post-syncdb, который удаляет физическую таблицу, созданную Django, и запускает нашу команду «create view ...». Тем не менее, сигнал post-syncdb немного эзотеричен в том виде, в котором он срабатывает, поэтому также следует предупредить emptor.
EDIT: Конечно, по «пост-SyncDB сигнал» Я имею в виду «пост-SyncDB слушателя»
Чтобы команда syncdb работала, не ставьте класс модели для представления в models.py, а отдельный файл! –
Лучше: см. Ответ ниже об управляемом = False в классе Meta на вашей модели. –
Представление не должно иметь то же имя, что и приложение. Просто используйте поле Meta db_table. Например, view с именем its_a_View. class Meta: db_table = u'its_a_view ' – grantk