从Django模型创建数据库视图

时间:2018-08-13 08:09:32

标签: 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 [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时,我应该忘记虚拟表“视图”吗?

3 个答案:

答案 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