Django数据库操作
发表于|更新于
|字数总计:1.1k|阅读时长:4分钟|
Django项目
0.说在前面
0.1 Django ORM
Django 模型使用自带的 ORM。
对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换。
ORM 在业务逻辑层和数据库层之间充当了桥梁的作用。
ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。
使用 ORM 的好处:
使用 ORM 的缺点:
- ORM 代码转换为 SQL 语句时,需要花费一定的时间,执行效率会有所降低。
- 长期写 ORM 代码,会降低编写 SQL 语句的能力。
ORM 解析过程:
- 1、ORM 会将 Python 代码转成为 SQL 语句。
- 2、SQL 语句通过 pymysql 传送到数据库服务端。
- 3、在数据库中执行 SQL 语句并将结果返回。
ORM 对应关系表:
1.连接数据库
1.1 直接下载MySQL(5.7版本以上)
将端口Port设置为3306,管理员Management User为root,密码Password为123456。
运行以下命令启动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.3.2 配置settings文件
打开settings.py项目配置文件
找到DATABASES配置项,并按以下修改:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
DATABASES = { 'default': { '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的表,表的结构如下图所示:
2.2 数据增删改
先于urls.py 文件的urlpatterns添加以下代码:
1 2 3 4 5 6 7 8 9
|
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/
可观察到已经有新增的数据:
2.2.2 修改数据
将id为3的数据的score 改为 5
1 2 3 4 5 6
|
def test_edit(request): """修改评价""" models.Evaluation.objects.filter(id=3).update(score=5) return HttpResponse('修改成功')
|
浏览器访问http://localhost:8888/test/edit/
2.2.3 删除数据
删除id为3的数据
1 2 3 4 5 6
|
def test_delete(request): """删除评价""" models.Evaluation.objects.filter(id=3).delete() return HttpResponse('删除成功')
|
浏览器访问http://localhost:8888/test/delete/
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控制台输出结果为:
浏览器返回如下: