从django模型创建数据库视图

从django模型创建数据库视图,django,Django,我学习了将sql视图作为虚拟表来简化sql操作,如 MySQL [distributor]> CREATE VIEW CustomerEMailList AS -> SELECT cust_id, cust_name, cust_email -> FROM Customers -> WHERE cust_email IS NOT NULL; Query OK, 0 rows affected (0.026 sec) MySQL [distribu

我学习了将sql视图作为虚拟表来简化sql操作,如

MySQL [distributor]> CREATE VIEW CustomerEMailList AS
    -> SELECT cust_id, cust_name, cust_email
    -> FROM Customers
    -> WHERE cust_email IS NOT NULL;
Query OK, 0 rows affected (0.026 sec)

MySQL [distributor]> select * from customeremaillist;
+------------+---------------+-----------------------+
| cust_id    | cust_name     | cust_email            |
+------------+---------------+-----------------------+
| 1000000001 | Village Toys  | sales@villagetoys.com |
| 1000000003 | Fun4All       | jjones@fun4all.com    |
| 1000000004 | Fun4All       | dstephens@fun4all.com |
| 1000000005 | The Toy Store | kim@thetoystore.com   |
| 1000000006 | toy land      | sam@toyland.com       |
+------------+---------------+-----------------------+
5 rows in set (0.014 sec)
当我随后查看Django文档时,没有这样的功能来创建虚拟模型表,从而简化数据操作


在使用Django ORM时是否应该忘记虚拟表视图?

Django目前没有内置的视图支持

但是您可以使用包来构造这样的视图

安装软件包(例如使用pip)后:

 pip install django-database-view
此外,dbview应用程序必须在settings.py文件中注册:

现在您可以构造视图了,这看起来有点类似于模型的构造,只是您需要实现一个视图。。函数,指定视图后面的查询。类似于:

from django.db import models
from dbview.models import DbView

class CustomerEMailList(DbView):
    cust = models.OneToOneField(Customer, primary_key=True)
    cust_name = models.CharField()
    cust_email = models.CharField()

    @classmethod
    def view(klass):
        qs = (Customers.objects.filter(cust_email__isnull=False)
                               .values('cust_id', 'cust_name', 'cust_email'))
        return str(qs.query)
现在我们可以进行迁移:

./manage.py makemigrations
现在在迁移中,我们需要做一个更改:与构造的视图相关的migrations.CreateModel调用应该更改为dbview模块的CreateView。看起来像:

from django.db import migrations
from dbview import CreateView

class Migration(migrations.Migration):

    dependencies = []

    operations = [
        CreateView(
            name='CustomerEMailList',
            fields=[
                # ...
            ],
        ),
    ]
根据,你可以像下面这样做

创建视图:

create view temp_user as
select id, first_name from auth_user;
创建不受管理的模型,并显式命名db_表:

class TempUser(models.Model):
    first_name = models.CharField(max_length=100)

    class Meta:
        managed = False
        db_table = "temp_user"
您将能够查询,但一旦尝试更新,您将收到一个错误

像往常一样询问:

TempUser.objects.all().values()

我还没有尝试过这个,但我肯定会的。

我创建了一个Django插件,您可以创建一个视图表。你可以在pypi.org上查看

使用pip安装django视图表安装,并按如下方式设置已安装的应用程序:

已安装的应用程序=[ “查看表”, ] 因此,视图表模型可以编写如下:

从django.db导入模型 从view_table.models导入ViewTable 基表 类Bookmodels。模型: 名称=型号。CharFieldmax_长度=100 类别=型号。CharFieldmax_长度=100 视图表 类BooksViewTable: 类别=型号。CharFieldmax_长度=100 count=models.IntegerField @类方法 def获取_查询您自己: 选择sql语句 returnbook.objects.values'category'.annotatecount=models.Count'category'.query 最后,创建表:

python manage.py createviewtable
django数据库视图有一个扩展:django数据库视图包的核心功能目前总共包含42行,因此从中挑选并适应您的需要可能会很有趣,而不是引入外部依赖性。我认为这个包已损坏,这不起作用。不幸的是,它只能用于MySQL数据库:谢谢你,我的朋友。请注意,您需要导入“dbview.models”,而不仅仅是“dbview”。因此,第二行必须替换为“from dbview.models import dbview”@ProgramadoresBrasil:hi,感谢您的报告,已更新!这是一个有趣的隐藏特性。请注意,视图中需要一个id字段,即使您没有在模型中引用它,否则Django会抱怨。还以基于联接的多表视图为例。。。您甚至不需要引用视图中的所有字段,只需引用主键,然后在Django视图模型中将它们声明为ForeignKey字段,并让Django执行所有关系处理和延迟加载。
TempUser.objects.all().values()