Django模型-在Django ORM上建模(Postgres-12数据库视图)
我很难弄清楚如何将Postgres数据库视图(我正在使用Postgres 12)建模到Django ORM(Django 3.1和Python 3.8.5)。我在stackoverflow中尝试了这个答案,但仍然得到了相同的错误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(
# 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
这是我的Djangomodels.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=[…]
代码块是myvItems
模型的原始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操作。请检查一次。