备忘录:使用Python + Django,在Postgres上创建简单的界面

只使用Windows + Python3.9来完成。Django版本为3.2.8。
此次不是考虑使用REST,而是假设使用普通的界面,所以不使用Django REST框架。

Django的准备

假设已经安装了Python。

先试试在虚拟环境中运行,所以需要安装virtualenv:
pip install virtualenv
在适当的文件夹创建环境:
virtualenv env1
进入环境:
Script/activate.bat执行
然后直接用pip安装:
pip install django
接着尝试确认导入是否正常:
py
import django
print(django.get_version())

绘制图像

暂时在已创建的虚拟环境内创建测试项目
django-admin startproject tespt
进入该项目并启动。

(env1) C:\python\env1\testpj>py manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
You have 18 unapplied migration(s). Your project may not work properly until you apply the
Run 'python manage.py migrate' to apply them.
October 19, 2021 - 16:06:43
Django version 3.2.8, using settings 'testpj.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

当更新警报出现时,无视它并连接到localhost:8000,屏幕上将显示“安装成功!恭喜!”并启动。

我创建一个名为myapp的项目,使用python manage.py startapp myapp。

将testpj的settings.py文件中的INSTALLED_APPS添加

INSTALLED_APPS = [
    'myapp',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

在相同的位置的urls.py文件中,需要添加include语句来查看myapp的urls。
※需要在from语句中添加include。

urlpatterns = [
    path('admin/', admin.site.urls),
    path('myapp/', include('myapp.urls')),
]

为了创建一个适当显示的界面,
暂时创建一个templates文件夹并放置index.html文件。(使用UTF-8编写)
由于在项目的根目录下创建了templates文件夹,因此需要修改setting.py文件。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>テスト</title>
</head>
<body>
    <h1>テスト</h1>
    <div>{{message}}</div>
</body>
</html>
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [ BASE_DIR/'templates'], ここを変更
        'APP_DIRS': True,

在view.py中,我们需要设置访问该模板的配置并传递值。

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
def index(request):
  params = {
    'message':'メッセージ'
  }
  return render(request, 'myapp/index.html', params)

我连上了 http://localhost:8000/myapp/。

与Postgres的连接

由于需要 psycopg2 和 psycopg2-binary,所以通过 pip 进行安装。
更改 settings.py 的数据库设置。

只需一个选项,请用中文进行本地化改写:

OR映射很麻烦。据说可以执行原始的SQL。先试试迁移,好像是必要的,所以进行一次执行。

运行以下命令生成数据库迁移文件:
python manage.py makemigrations
然后执行以下命令进行数据库迁移:
python manage.py migrate

尝试创建一个超级用户
运行python manage.py createsuperuser命令

到目前为止很容易。
如果想要从现有表中拉取数据,只需简单地执行SQL查询是不够的,需要创建一个类。
可以参考这篇文章或官方文档,执行python manage.py inspectdb命令,以创建之前在Node.js中测试过的表的类。

class Test(models.Model):
    id = models.IntegerField(blank=True, null=True)
    name = models.CharField(max_length=50, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'test'


class Usr(models.Model):
    usr = models.CharField(max_length=100, blank=True, null=True)
    pass_field = models.CharField(db_column='pass', max_length=100, blank=True, null=True)  # Field renamed because it was a Python reserved word.

    class Meta:
        managed = False
        db_table = 'usr'

在这里,作为Django的限制,id列似乎受到主键的限制。
虽然没有在数据库端进行设置,但暂时将上述选项更改为null=False,primary_key=True。
在view.py中写入查询语句,并进行强制输出。

def index(request):
  if "id" in request.GET:
    sql = "SELECT id,name FROM test WHERE id = %(id)s"
    params = {"id": request.GET.get("id")}
    names = Test.objects.raw(sql, params)

  v_params = {
    'message': list(names)[0].name if len(list(names)) == 1 else 'NG'
  }
  return render(request, 'myapp/index.html', v_params)

据说,看这个地方,即使不定义模型也能执行SQL查询。

虽然我不太熟悉Python,但并不是特别喜欢这种感觉。

广告
将在 10 秒后关闭
bannerAds