Django项目

DjangoProject _1_.png

0.说在前面

0.1 Django ORM

Django 模型使用自带的 ORM。

对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换。

ORM 在业务逻辑层和数据库层之间充当了桥梁的作用。

ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。

img

使用 ORM 的好处:

  • 提高开发效率。
  • 不同数据库可以平滑切换。

使用 ORM 的缺点:

  • ORM 代码转换为 SQL 语句时,需要花费一定的时间,执行效率会有所降低。
  • 长期写 ORM 代码,会降低编写 SQL 语句的能力。

ORM 解析过程:

  • 1、ORM 会将 Python 代码转成为 SQL 语句。
  • 2、SQL 语句通过 pymysql 传送到数据库服务端。
  • 3、在数据库中执行 SQL 语句并将结果返回。

ORM 对应关系表:img

1.连接数据库

1.1 直接下载MySQL(5.7版本以上)

将端口Port设置为3306,管理员Management User为root,密码Password为123456。

运行以下命令启动MySQL服务。

1
net start mysql

1.2 通过Docker安装MySQL

Windows Terminal运行以下命令:

1
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

在Docker container 启动 MySQL服务。

1.3 Django项目连接MySQL数据库

1.3.1 安装MySQLClient
1
pip install mysqlclient
1.3.2 配置settings文件

打开settings.py项目配置文件

找到DATABASES配置项,并按以下修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# settings.py

DATABASES = {
'default': {
# 连接本地mysql数据库
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysql', # 你的数据库名
'USER': 'root', # 你的用户名
'PASSWORD': '123456', # 你的密码
'HOST': 'localhost', # 本地连接
'PORT': '3306', # 本地端口号

}
}

2. 建表并进行简单的增删改操作

2.1 建立表格

打开APP下的models.py文件

假设要创建一个评价模块,其中:

需要编码,模块名称,分值

1
2
3
4
5
6
models.py

class Evaluation(models.Model):
id = models.AutoField(primary_key=True, verbose_name="编码")
name = models.CharField(verbose_name="模块名称", max_length=32)
score = models.PositiveIntegerField(verbose_name="分值", max_length=2) # 正整数

在终端运行以下命令:

1
2
python manage.py makemigrations
python manage.py migrate

可以看到数据库内以及建好一个名为app01_evalution的表,表的结构如下图所示:

image-20220921212211849

2.2 数据增删改

先于urls.py 文件的urlpatterns添加以下代码:

1
2
3
4
5
6
7
8
9
# urls.py

urlpatterns = [
...,
path('test/add/', views.test_add),
path('test/edit/', views.test_edit),
path('test/delete/', views.test_delete),
path('test/list/', views.test_list),
]
2.2.1 新增数据

新增如下数据

ID 模板名称 分值
1 模块1:选择题目 20
2 模块2:掌握情况 10
3 Need_TO_DELETE 0

于views.py 添加:

1
2
3
4
5
6
7
8
9
10
from django.shortcuts import render,redirect,HttpResponse
from app01 import models

def test_add(request):
"""添加评价"""
names = ['模块1:选择题目', '模块2:掌握情况', 'Need_TO_DELETE']
scores = [20, 10, 0]
for i in range(3):
models.Evaluation.objects.create(name=names[i], score=scores[i])
return HttpResponse('添加成功')

浏览器访问 http://localhost:8888/test/add/

可观察到已经有新增的数据:

image-20220921215756701

2.2.2 修改数据

将id为3的数据的score 改为 5

1
2
3
4
5
6
# views.py

def test_edit(request):
"""修改评价"""
models.Evaluation.objects.filter(id=3).update(score=5)
return HttpResponse('修改成功')

浏览器访问http://localhost:8888/test/edit/

image-20220921220530673

2.2.3 删除数据

删除id为3的数据

1
2
3
4
5
6
# views.py

def test_delete(request):
"""删除评价"""
models.Evaluation.objects.filter(id=3).delete()
return HttpResponse('删除成功')

浏览器访问http://localhost:8888/test/delete/

image-20220921220729930

2.2.4 展示所有数据

在Python中输出表中的数据并展示在页面上

1
2
3
4
5
def test_list(request):
datas = models.Evaluation.objects.all()
for data in datas:
print(data.id, data.name, data.score)
return render(request, 'test.html', {'datas': datas})

在test.html的nav标签下新增以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<div class="card">
<div class="card-header">
评价模块
</div>
<div class="card-body">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th scope="col">编码</th>
<th scope="col">模块名称</th>
<th scope="col">分值</th>
<th scope="col">操作</th>
</tr>
</thead>
<tbody>
{% for obj in datas %}
<tr>
<th scope="row">{{ obj.id }}</th>
<td>{{ obj.name }}</td>
<td>{{ obj.score }}</td>
<td>
<a href="#" class="btn btn-primary btn-sm">编辑</a>
<a href="#" class="btn btn-danger btn-sm">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>

</div>
</div>

python控制台输出结果为:

image.png

浏览器返回如下:

image-20220921222920070