Django模型-在Django ORM上建模(Postgres-12数据库视图)

Django模型-在Django ORM上建模(Postgres-12数据库视图),django,postgresql,django-models,Django,Postgresql,Django Models,我很难弄清楚如何将Postgres数据库视图(我正在使用Postgres 12)建模到Django ORM(Django 3.1和Python 3.8.5)。我在stackoverflow中尝试了这个答案,但仍然得到了相同的错误 # Generated by Django 3.1 on 2020-09-19 09:30 from django.db import migrations, models import django.utils.timezone class Migration(

我很难弄清楚如何将Postgres数据库视图(我正在使用Postgres 12)建模到Django ORM(Django 3.1和Python 3.8.5)。我在stackoverflow中尝试了这个答案,但仍然得到了相同的错误

# Generated by Django 3.1 on 2020-09-19 09:30

from django.db import migrations, models
import django.utils.timezone


class Migration(migrations.Migration):

    dependencies = [
        ('items', '0002_location_uom'),
    ]

    # operations = [
    #     migrations.CreateModel(
    #         name='vItems',
    #         fields=[
    #             ('id', models.AutoField(primary_key=True, serialize=False)),
    #             ('item_code', models.CharField(max_length=100)),
    #             ('sku', models.CharField(max_length=100)),
    #             ('name', models.CharField(max_length=100)),
    #             ('description', models.CharField(max_length=100)),
    #             ('uom_id', models.IntegerField()),
    #             ('location_id', models.IntegerField()),
    #             ('uom', models.CharField(max_length=50)),
    #             ('location', models.CharField(max_length=50)),
    #             ('created_date', models.DateTimeField(default=django.utils.timezone.now)),
    #             ('created_by', models.IntegerField()),
    #             ('updated_date', models.DateTimeField(auto_now=True)),
    #             ('updated_by', models.IntegerField()),
    #         ],
    #         options={
    #             'db_table': 'vItems',
    #             'managed': False,
    #         },
    #     ),
    # ]

    sql = """
        CREATE VIEW vItems
        AS
        SELECT it.id,
            it.item_code,
            it.sku,
            it.name,
            it.description,
            it.uom_id,
            it.location_id,
            it.created_date,
            it.created_by,
            it.updated_date,
            it.updated_by,
            uom.uom,
            loc.location
        FROM 
            items it
            JOIN uom uom ON uom.id = it.uom_id
            JOIN location loc ON loc.id = it.location_id;
    """

    operations = [
        migrations.RunSQL('DROP VIEW IF EXISTS vItems;'),
        migrations.RunSQL(sql)
    ]
可视化我的数据库模式

Database Objects
Tables:
|_items
|_uom
|_location
|
Views:
|_vItems
当运行下面的SQL命令到
pgAdmin 4
时,
vItems
包含连接三个表
项、计量单位、位置的SQL命令。我可以获取所有项目数据,而不会出现任何错误

SELECT * FROM vItems
这是我的Django
models.py
code:

class Items(models.Model):
    id          = models.AutoField(primary_key = True)
    item_code   = models.CharField(max_length = 100)
    sku         = models.CharField(max_length = 100)
    name        = models.CharField(max_length = 100)
    description = models.CharField(max_length = 100)
    uom_id      = models.IntegerField()
    location_id = models.IntegerField()
    created_date= models.DateTimeField(default=timezone.now)
    created_by  = models.IntegerField()
    updated_date= models.DateTimeField(auto_now = True)
    updated_by  = models.IntegerField()

    class Meta:
        db_table = "items"


    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('item_detail', kwargs = {'pk': self.id})


class UOM(models.Model):
    id          = models.AutoField(primary_key = True)
    uom         = models.CharField(max_length = 50) 
    created_date= models.DateTimeField(default=timezone.now)
    created_by  = models.IntegerField()
    updated_date= models.DateTimeField(auto_now = True)
    updated_by  = models.IntegerField()

    class Meta:
        db_table = "uom"

    def __str__(self):
        return self.uom


class Location(models.Model):
    id          = models.AutoField(primary_key = True)
    location    = models.CharField(max_length = 50) 
    created_date= models.DateTimeField(default=timezone.now)
    created_by  = models.IntegerField()
    updated_date= models.DateTimeField(auto_now = True)
    updated_by  = models.IntegerField()

    class Meta:
        db_table = "location"

    def __str__(self):
        return self.location


class vItems(models.Model):
    id          = models.AutoField(primary_key = True)
    item_code   = models.CharField(max_length = 100)
    sku         = models.CharField(max_length = 100)
    name        = models.CharField(max_length = 100)
    description = models.CharField(max_length = 100)
    uom_id      = models.IntegerField()
    location_id = models.IntegerField()
    uom         = models.CharField(max_length = 50)
    location    = models.CharField(max_length = 50) 
    created_date= models.DateTimeField(default=timezone.now)
    created_by  = models.IntegerField()
    updated_date= models.DateTimeField(auto_now = True)
    updated_by  = models.IntegerField()

    class Meta:
        managed = False
        db_table = "vItems"
这是我对Django的错误

Environment:


Request Method: GET
Request URL: http://localhost:8000/items/

Django Version: 3.1
Python Version: 3.8.5
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'items.apps.ItemsConfig',
 'users.apps.UsersConfig',
 'dashboard.apps.DashboardConfig',
 'crispy_forms']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']


Template error:
In template D:\DELETE THIS\PiTON\web\fnd\src\templates\index.html, error at line 35
   relation "vItems" does not exist
LINE 1: ...Items"."updated_date", "vItems"."updated_by" FROM "vItems" O...

*some python stack tracing here...*

Exception Type: ProgrammingError at /items/
Exception Value: relation "vItems" does not exist
LINE 1: ...Items"."updated_date", "vItems"."updated_by" FROM "vItems" O...
                                                             ^
编辑:附加信息 这是
migrations
下的
0003_vItems.py
文件:

注释的
operations=[…]
代码块是my
vItems
模型的原始
makemigrations项。下面的未注释代码是我尝试过的解决方案,但仍然得到了相同的错误

# Generated by Django 3.1 on 2020-09-19 09:30

from django.db import migrations, models
import django.utils.timezone


class Migration(migrations.Migration):

    dependencies = [
        ('items', '0002_location_uom'),
    ]

    # operations = [
    #     migrations.CreateModel(
    #         name='vItems',
    #         fields=[
    #             ('id', models.AutoField(primary_key=True, serialize=False)),
    #             ('item_code', models.CharField(max_length=100)),
    #             ('sku', models.CharField(max_length=100)),
    #             ('name', models.CharField(max_length=100)),
    #             ('description', models.CharField(max_length=100)),
    #             ('uom_id', models.IntegerField()),
    #             ('location_id', models.IntegerField()),
    #             ('uom', models.CharField(max_length=50)),
    #             ('location', models.CharField(max_length=50)),
    #             ('created_date', models.DateTimeField(default=django.utils.timezone.now)),
    #             ('created_by', models.IntegerField()),
    #             ('updated_date', models.DateTimeField(auto_now=True)),
    #             ('updated_by', models.IntegerField()),
    #         ],
    #         options={
    #             'db_table': 'vItems',
    #             'managed': False,
    #         },
    #     ),
    # ]

    sql = """
        CREATE VIEW vItems
        AS
        SELECT it.id,
            it.item_code,
            it.sku,
            it.name,
            it.description,
            it.uom_id,
            it.location_id,
            it.created_date,
            it.created_by,
            it.updated_date,
            it.updated_by,
            uom.uom,
            loc.location
        FROM 
            items it
            JOIN uom uom ON uom.id = it.uom_id
            JOIN location loc ON loc.id = it.location_id;
    """

    operations = [
        migrations.RunSQL('DROP VIEW IF EXISTS vItems;'),
        migrations.RunSQL(sql)
    ]
下面是调用
models.py中的
vItems
views.py

from django.shortcuts import render
from django.utils import timezone
from django.contrib.auth.mixins import (
    LoginRequiredMixin,     # CLASS BASED REQUIRED LOGIN TO GAIN ACCESS
    UserPassesTestMixin     # UPDATE ONLY IF DATA IS FROM THE CURRENT USER [CAN BE USE SUPERVISOR UPDATE ONLY]
)
from django.views.generic import (
    ListView, 
    DetailView,
    CreateView,
    UpdateView,
    DeleteView
)


from .models import (
    Items,
    UOM,
    Location,
    vItems
)


class ItemListView(LoginRequiredMixin, ListView):
    model = vItems
    template_name = 'items/list.html' # <app>/<model>_<viewtype>.html
    context_object_name = 'items'
    ordering = ['name']

**some class based views code here...**
从django.exe导入渲染
从django.utils导入时区
从django.contrib.auth.mixins导入(
LoginRequiredMixin,#需要基于类的登录才能获得访问权限
UserPasseTestMixin#仅当数据来自当前用户时才更新[只能使用管理员更新]
)
从django.views.generic导入(
ListView,
详细视图,
CreateView,
更新视图,
删除视图
)
从。模型导入(
项目,
计量单位,
位置,
维特姆
)
类ItemListView(LoginRequiredMixin,ListView):
型号=vItems
template_name='items/list.html'#/_.html
上下文\对象\名称='items'
排序=['name']
**这里有一些基于类的视图代码**
根据我自己的理解总结这个问题,我从Django那里得到了一个错误,好像我的
models.py(class vItems)
中有什么错误不能被
Django
转换为本机SQL命令,这与上面错误中所述的
“relation”
有关,我在猜测
内部连接
语句?但这对我来说没有意义,因为SQL命令在
pgAdmin 4上运行得非常好

我在这里遗漏了什么来得到这个错误


提前感谢您的回答。

您可以发布您的vItems模型的迁移文件吗?我已经添加了
vItems
模型的迁移文件。我起草问题时忘了加上它。我希望这些信息能有助于详细阐述这个问题。谢谢你还是有同样的错误还是不同的错误?异常值:关系“vItems”不存在第1行:…项“.”更新日期“,”vItems“,”更新人“来自”vItems“O..@AyushBansal是的,我试图使用
items
表在我的视图中传递它。我可以得到项目数据。当我调用并使用
vItems
时,我得到的是上述相同的错误。如果您在对vItems迁移的操作部分进行注释后仍然得到相同的错误,则表示您在其他迁移文件中仍然有此vItems CreateModel操作。请检查一次。