如何在 Django 应用程序中访问 PostgreSQL 数据库
Posted
技术标签:
【中文标题】如何在 Django 应用程序中访问 PostgreSQL 数据库【英文标题】:How to access PostgreSQL database in Django application 【发布时间】:2018-08-04 09:29:13 【问题描述】:我创建了一个简单的Django
应用程序,它尝试访问PostgreSQL
数据库中名为fruits
的表并显示其内容。据我所知,我遵循了官方的Django
文档并在下面的代码中实现了。但我相信下面的过程是不完整的,因为fruits.objects.all()
无法获取任何数据。我遗漏了一些东西,任何人都可以指出任何帮助将不胜感激。
餐桌:水果
models.py
from django.db import models
class fruits(models.Model):
ID = models.CharField(max_length=20)
Name = models.CharField(max_length=20)
def __str__(self):
return self.Name
views.py
from database.models import fruits
def index(request):
data = fruits.objects.all()
print(len(data))
for item in data:
print(item)
settings.py
DATABASES =
'default':
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': '<database_name>',
'USER': '<user_name>',
'PASSWORD': '<password>',
'HOST': '<host_name>',
'PORT': '',
【问题讨论】:
类名按照惯例用大写字母书写,是单数名词。因此class fruits
应该变成class Fruit
。类属性按照约定用snake_case
编写,因此id
而不是ID
,name
而不是Name
。检查PEP 8 并遵循编码惯例。
【参考方案1】:
默认情况下,Django 将为模型创建新表appname_modelname
。所以在你的情况下,这个查询集fruits.objects.all()
从app_fruits
表中获取数据,而不是fruits
。您可以使用db_table
元选项指定表名。例如,将模型 fruits
与现有表 fruits
链接,将以下 Meta
添加到模型:
class fruits(models.Model):
ID = models.IntegerField(max_length=20)
Name = models.CharField(max_length=20)
class Meta:
db_table = 'fruits'
def __str__(self):
return self.Name
UPD
Django 期望 id
字段默认是主键而不是 ID
,将此添加 primary_key
选项更改为 ID
字段:
ID = models.IntegerField(max_length=20, primary_key=True)
【讨论】:
我现在收到这个错误django.db.utils.ProgrammingError: column fruits.id does not exist
LINE 1: SELECT "fruits"."id", "fruits"."Name" FROM "fruits"
@OliviaBrown 将 primary_key=True 添加到 ID 字段:ID = models.CharField(max_length=20, primary_key=True)
。
我强烈建议不要将CharField
用作主键。这是一个不好的做法。使用surrogate keys。
@cezar 谢谢我错过了这部分。在数据库中主键是整数字段。所以它也应该是整数而不是模型中的字符字段。以上是关于如何在 Django 应用程序中访问 PostgreSQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章