我学会了将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时,我应该忘记虚拟表“视图”吗?
答案 0 :(得分:4)
就我所知,Django目前还没有内置的视图支持。
但是您可以使用django-database-view
包 构造这样的视图。
安装软件包后(例如使用pip):
pip install django-database-view
此外,dbview
应用必须在settings.py
文件中注册:
# settings.py
INSTALLED_APPS = (
# ...
'dbview',
# ...
)
现在您可以构造一个视图,这看起来与模型的构造有点“相似”,除了您需要实现一个view(..)
函数来指定视图后面的查询。类似于:
from django.db import models
from dbview 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
的调用应为更改为CreateView
模块的 dbview
。看起来像这样:
from django.db import migrations
from dbview import CreateView
class Migration(migrations.Migration):
dependencies = []
operations = [
migrations.CreateView(
name='CustomerEMailList',
fields=[
# ...
],
),
]
答案 1 :(得分:1)
根据Django ORM Cookbook by Agiliq,您可以按照以下步骤进行操作。
创建视图:
create view temp_user as
select id, first_name from auth_user;
创建一个不受管理的模型,并明确命名db_table:
class TempUser(models.Model):
first_name = models.CharField(max_length=100)
class Meta:
managed = False
db_table = "temp_user"
您将可以进行查询,但是尝试更新时会收到错误消息。
像往常一样查询:
TempUser.objects.all().values()
我还没有尝试过,但是我一定会的。
答案 2 :(得分:1)
我创建了一个可以创建视图表的 Django 插件。您可以在 here 上查看 pypi.org
使用 pip install django-view-table
安装并像这样设置 INSTALLED_APPS
:
INSTALLED_APPS = [
'viewtable',
]
因此,视图表模型可以写成如下:
from django.db import models
from view_table.models import ViewTable
# Base table
class Book(models.Model):
name = models.CharField(max_length=100)
category = models.CharField(max_length=100)
# View table
class Books(ViewTable):
category = models.CharField(max_length=100)
count = models.IntegerField()
@classmethod
def get_query(self):
# Select sql statement
return Book.objects.values('category').annotate(count=models.Count('category')).query
最后,创建表:
python manage.py createviewtable