Hemos hecho esto extensamente en nuestras aplicaciones con MySQL para evitar la limitación de la base de datos única de Django. Nuestra aplicación tiene un par de bases de datos que viven en una sola instancia de MySQL. Podemos lograr combinaciones de modelos de bases de datos cruzadas de esta manera siempre que hayamos creado vistas para cada tabla en la base de datos "actual".
En cuanto a las inserciones/actualizaciones en las vistas, con nuestros casos de uso, una vista es básicamente un "select * from [db.table];". En otras palabras, no realizamos ninguna combinación compleja ni filtro, así que insertar/actualizar el desencadenador de save() funciona muy bien. Si su caso de uso requiere combinaciones tan complejas o un filtrado extenso, sospecho que no tendrá ningún problema para los escenarios de solo lectura, pero puede encontrarse con problemas de inserción/actualización. Creo que hay algunas restricciones subyacentes en MySQL que le impiden actualizar en vistas que cruzan tablas, tienen filtros complejos, etc.
De todos modos, su kilometraje puede variar si está utilizando un RDBMS que no sea MySQL, pero Django doesn ' realmente me importa si está sentado encima de una mesa o vista física. Será el RDBMS el que determine si realmente funciona como esperabas. Como señaló un comentador anterior, probablemente lanzará syncdb por la ventana, aunque lo solucionamos con una señal post-syncdb que elimina la tabla física creada por Django y ejecuta nuestro comando "create view ...". Sin embargo, la señal post-syncdb es un poco esotérica en la forma en que se desencadena, por lo que también debes tener precaución.
EDIT: Por supuesto, por "señal post-syncdb" quiero decir "escucha post-syncdb"
Para que el comando syncdb funcione, ¡no coloque su clase de modelo para la vista en models.py sino un archivo separado! –
Mejor: vea la respuesta a continuación sobre managed = False en la clase Meta en su modelo. –
La vista dows no necesita tener el mismo nombre que la aplicación. Solo usa el campo meta db_table. Por ejemplo, vista llamada its_a_View. clase Meta: db_table = u'its_a_view ' – grantk