Django 模型
Django 模型
Django 对各种数据库提供了统一调用的API,这里以MySQL为例作为介绍。
首先需要安装pymysql以在Python中支持MySQL
pip install pymysql

数据库统一调用原理 —— Django ORM
Django模型使用对象关系映射(Object Relational Mapping,ORM)用于实现面向对象编程中不同类型系统的数据之间的转换。
ROM在业务逻辑和数据库层之间充当了桥梁的作用,通过使用描述对象和数据库之间的映射元数据,将程序中的对象自动持久化到数据库中
- 使用ORM的好处:
- 提高开发效率
- 不同数据库可以平滑切换
- 缺点:
- ORM代码转换为SQL语句时,需要花费一定的时间,执行效率会有所降低
- 长期写ORM代码,会降低SQL语句编写的能力
解析过程
- 首先,ORM会将Python代码转换为SQL语句
- SQL语句通过pymysql传送到数据库服务端
- 在数据库中执行SQL语句并将结果返回
ORM对应关系表

数据库配置
ORM无法操作到数据库级别,只能操作到数据表,所以我们需要先自己创建一个数据库,这里我创建了一个名为testdb的数据库

修改settings.py中的DATABASES配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 使用 MySQL 数据库
'NAME': 'webdb', # 数据库名称
'USER': 'root', # 数据库用户名
'PASSWORD': '1234', # 数据库密码
'HOST': 'localhost', # 数据库主机
'PORT': '3306', # 数据库端口
'OPTIONS': {
'charset': 'utf8mb4', # 使用 utf8mb4 字符集
}
}
}
接着需要告诉Django使用pymysql模块链接mysql数据库,在与settings.py同级目录下的__init__.py中引入模块,并配置
# 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置
import pymysql
pymysql.install_as_MySQLdb()
定义模型
创建APP
Django规定,如果要使用模型,必须创建一个App。在Django中,“APP”指的是一个具有特定功能的模块化组件,包括模型(Models)、视图(Views)、模板(Templates)和URL配置等。
Pycharm中选择新建Python软件包 命名为TestModel

再创建一个models.py文件 创建一个User对象继承自models.Model
from django.db import models
class User(models.Model):
name = models.CharField(max_length=20) # CharField 相当于 VARCHAR(20)
在settings.py文件中找到INSTALLED_APPS,将我们创建的APP TestModel 加入进去
INSTALLED_APPS = [
'django.contrib.admin', # 管理员后台
'django.contrib.auth', # 认证系统
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles', # 静态文件处理
'TestModel',
]
打开命令行,移动到项目目录下,注意进入到Django的环境
python manage.py migrate # 创建表结构

运行以上指令创建数据库表结构,运行成功后,在数据库中会出现Django默认的一些表

执行以下指令,让Django知道我们的模型有了变更
python manage.py makemigrations TestModel

执行以下指令创建表结构
python manage.py migrate TestModel

此时在数据库中,可以看见我们创建的表testmodel_user,表名的组成结构为:应用名_类名

数据库操作
添加数据
修改urls.py文件,增加一个添加数据的接口
from django.urls import path
from TestModel import views
urlpatterns = [
path('', views.test),
path('testAdd/', views.testAdd),
]
在views.py中增加数据的函数
from django.shortcuts import render
from TestModel.models import User
def test(request):
context = {}
context['hello'] = 'Hello World!'
return render(request, 'test.html', context)
def testAdd(request):
test1 = User(name = "test1")
test1.save()
return render(request, 'test.html', {'db': '数据添加成功!'})
修改一下页面显示test.html
<h1>{{ hello }}</h1>
{% if db %}
<h1>{{ db }}</h1>
{% endif %}
运行项目,查看效果:
打开原链接时,仍显示之前的界面

输入testAdd路由,成功显示出db变量的内容,说明添加成功

在数据库中查看

成功添加了一个名为test1的用户。
获取数据
views.py中添加testGetAll接口
def testGetAll(request):
users = User.objects.all() # 获取所有用户
context = {'users': users}
return render(request, 'test.html', context)
urls.py中添加路径
path('testGetAll/', views.testGetAll),
test.html中添加查询到的列表
path('testGetAll/', views.testGetAll),
打开链接查看结果

上述代码中使用了User.object.all()方法获取了所有数据,相当于select * from testmodel_user,还可以通过其他一些条件获取数据
| 函数 | 描述 |
|---|---|
User.objects.filter(id=1) |
filter相当于SQL中的where,可以设置条件过滤结果 |
User.object.sget(id=1) |
获取单个对象 |
User.objects.order_by("id") |
根据id排序 |
User.objects.order_by("name")[0,2] |
从第0行开始,输出2行数据,相当于SQL中的offset 0 limit 2 |
更新数据
修改数据可以使用save()或updata()
views.py增加接口:
def testUpdate(request, id):
try:
user = User.objects.get(id=id) # 根据 ID 获取用户
user.name = "李四" # 更新用户名称
user.save() # 保存更改
context = {'message': "更新成功"}
except User.DoesNotExist:
context = {'message': 'User not found'}
return render(request, 'test.html', context)
urls.py中增加路由:
path('testUpdate/<int:id>/', views.testUpdate),
test.html中增加message信息显示
{% if message %}
<h2>{{ message }}</h2>
{% endif %}
删除数据
删除数据库中的对象,只需调用该对象的delete()方法即可
def testDelete(request, id):
try:
user = User.objects.get(id=id) # 根据 ID 获取用户
user.delete() # 删除用户
context = {'message': "删除成功"}
except User.DoesNotExist:
context = {'message': 'User not found'}
return render(request, 'test.html', context)
urls.py中增加路由:
path('testDelete/<int:id>/', views.testDelete),
- 其他删除方法
- 删除所有数据:
User.objects.all().delete() - 删除符合条件的数据:
User.objects.filter(id=1).delete()
- 删除所有数据:

浙公网安备 33010602011771号