从django模型创建数据库视图
我学习了将sql视图作为虚拟表来简化sql操作,如从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
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()