如何在 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 而不是IDname 而不是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 existLINE 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 数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个应用程序访问 django 数据库

如何在django中访问数据表之外的数据表的ajax响应?

Django - 如何访问视图之外的请求对象?

如何在 django 模板的 forloop 中访问 If 语句中的元组值?

Django 设置:如何从应用程序的设置文件夹中访问变量

如何避免 Django 中的导入时数据库访问?