我可以在Django中使用数据库视图作为模型吗?

我想使用我的数据库中创build的视图作为我的Django视图的来源。

这是可能的,而不使用自定义的SQL?

****** 13/02/09更新***********

和许多答案一样,您可以在数据库中创build自己的视图,然后在models.py中定义它,然后在API中使用它。

一些警告虽然:

  • manage.py syncdb将不再工作
  • 视图在其名称的起始处需要与所有其他模型(表)相同的东西,例如,如果您的应用程序被称为“东西”,那么您的视图将需要被称为thing_ $ viewname

由于Django 1.1,你可以使用Options.managed 。

对于旧版本,您可以轻松地为视图定义模型类,并像使用其他视图一样使用它。 我只是testing它使用基于Sqlite的应用程序,它似乎工作正常。 只要确保在视图的“主键”列未命名为“id”的情况下添加主键字段并在Meta选项中指定视图的名称(如果您的视图未被称为“app_classname”)。

唯一的问题是,“syncdb”命令会引发exception,因为Django会尝试创build表。 您可以通过在不同于models.py的单独Python文件中定义“视图模型”来防止这种情况。 这样,Django在反省models.py时将不会看到它们,以确定为应用程序创build的模型,因此不会尝试创build表。

只是针对那些遇到这个问题(来自Google或其他任何人)的更新…

目前Django有一个简单的“正确的方式”来定义模型,而不用pipe理数据库表 :

Options.managed

默认为True ,这意味着Django将在syncdb创build适当的数据库表,并将它们作为resetpipe理命令的一部分删除。 也就是说,Django pipe理数据库表的生命周期。

如果为False ,则不会为此模型执行数据库表创build或删除操作。 如果模型表示已经通过其他方式创build的现有表或数据库视图,那么这非常有用。 这是managed唯一区别是False 。 模型处理的所有其他方面与正常情况完全相同。

我只是用postgres 9.4和django 1.8来实现一个模型。

我创build了这样的自定义迁移类:

 # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import migrations class Migration(migrations.Migration): dependencies = [ ('myapp', '0002_previousdependency'), ] sql = """ create VIEW myapp_myview as select your view here """ operations = [ migrations.RunSQL("drop view if exists myapp_myview;"), migrations.RunSQL(sql) ] 

我像平常一样写了模型。 它适用于我的目的。

– 当我运行makemigrations时,为模型创build了一个新的迁移文件,我手动删除了这个文件。

完全公开 – 我的观点是只读的,因为我使用从JSONB数据types派生的视图,并没有写入ON UPDATE INSTEAD规则。

我们在MySQL的应用程序中做了相当广泛的工作来解决Django的单一数据库限制问题。 我们的应用程序有一个数据库生活在一个单一的MySQL实例。 只要我们为“当前”数据库中的每个表创build了视图,就可以用这种方式实现跨数据库模型连接。

就插入/更新视图而言,在我们的用例中,视图基本上是“select * from [db.table];”。 换句话说,我们不做任何复杂的连接或过滤,所以从save()中插入/更新触发器就工作得很好。 如果您的用例需要如此复杂的连接或者广泛的过滤,我怀疑您对于只读场景不会有任何问题,但可能会遇到插入/更新问题。 我认为在MySQL中有一些基本的限制,可以防止你更新到跨表的视图,复杂的filter等等。

无论如何,如果您使用MySQL以外的RDBMS,您的里程可能会有所不同,但是Django并不关心它是否坐在物理表或视图之上。 这将是关系数据库确定它是否实际上按照您的预期运行。 正如前面的评论者指出的那样,尽pipe我们成功地使用了后syncdb信号来放弃由Django创build的物理表,并运行我们的“创build视图…”命令,但可能会将syncdb扔出窗口。 不过,后syncdb信号是被触发的方式有点深奥,所以要警惕在那里。

编辑:当然,“后syncdb信号”我的意思是“后syncdb听众”

从Django官方文档 ,你可以这样调用视图:

 #import library from django.db import connection #Create the cursor cursor = connection.cursor() #Write the SQL code sql_string = 'SELECT * FROM myview' #Execute the SQL cursor.execute(sql_string) result = cursor.fetchall() 

希望能帮助到你 ;-)