Django之ORM简介、ORM的基本操作、ORM基本语法、ORM语法的增删改查(结合使用)、Django请求生命周期流程图
文章目录
一、ORM简介
'''
ORM:对象关系映射
作用:我们以后再操作数据库的时候,就不用在写原生sql语句,用面向对象的代码去写,然后他给你翻译成原生sql语句。
缺点:封装程度太高,ORM的sql执行效率没有原生sql执行的效率高,这个效率的影响暂时忽略
关系映射:
类 表
对象 一条条数据(记录)
对象点名字 数据获取字段对应的值(字段)
ORM由于高度封装了SQL 所以有时候效率较低 我们需要自己写SQL
'''
二、ORM的基本操作
Django中写sql语句的地方在应用app文件夹下面的models.py文件里面书写
1.现在models.py中编写模型类
class User(models.Model):
# 字段名 = 字段类型 + 约束条件
# 创建主键字段和字段类型
id = models.AutoField(primary_key=True) # 类似于 id int primary key auto_increment
name = models.CharField(max_length=32) # 类似于 name varchar(32)
pwd = models.CharField(max_length=32) # 类似于 pwd varchar(32)
'''max_length参数必填'''
age = models.IntegerField() # 类似于 age int
# 由于每张表都应该有一个主键字段,并且主键字段名都叫id,
# 如果满足这两个条件,那么,可以省略不写,自动帮你创建主键字段出来
创建一张表出来,代码写完之后,需要执行两个命令才能把表创建出来
2.执行数据库迁移相关命令
python38 manage.py makemigrations 将操作记录到小本本上(migrations)
python38 manage.py migrate 将操作同步到数据库上
'''注意每次在models.py修改了与数据库相关的代码 都需要再次执行上述命令'''
三、ORM基本语法
from app01 import models
models.类名.objects.create() # 创建表数据
models.类名.objects.filter() # 查询表数据
"""
查
res=models.类名.objects.fileter(username=username).all() # 获取所有
res=models.类名.objects.fileter(username=username) # 获取所有
# 得到的结果是:<queryset>对象===========>[object, object1,]
# 要想操作具体的字段值,必须从列表中取出对象
res1 = res[0]
res1.username
res1.password
res=models.类名.objects.fileter(username=username).first() # 取第一条
res.username
res.password
"""
models.类名.objects.update() # 修改表数据
models.类名.objects.delete() # 删除表数据
四、ORM语法的增删改查(结合使用)
书写一个登录注册查看注册用户信息的前后端结合的完整功能展示出过来
首先:打开新的django项目,设置配置文件修改路径
连接数据库
去应用app文件夹下面的models.py文件夹下面创建表
操作表数据要执行数据迁移命令才能把表写入到数据库中
'''
python38 manage.py makemigrations 将操作记录到小本本上(migrations)
python38 manage.py migrate 将操作同步到数据库上
'''
添加表中数据
- 设置路由: 登录页面编写
路由层urls.py(开设接口)
视图层views.py(设置登录功能)
templates文件夹下面写登录页面的html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录界面</title>
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
<script src="{% static 'js/jquery.min.js' %}"></script>
<script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<form action="" method="post">
<h1 class="text-center">用户登录</h1>
<p class="form-group">username:
<input type="text" class="form-control" name="username">
</p>
<p class="form-group">password:
<input type="password" class="form-control" name="password">
</p>
<p class="form-group">
<input type="submit" value="登录" class="btn btn-success btn-block">
</p>
<p>
<a href="/register/" class="btn btn-danger btn-block">注册</a>
</p>
<p>
<a href="/shu_data/" class="btn btn btn-success btn-block">查看注册信息</a>
</p>
</form>
</divclass>
</div>
</div>
</body>
</html>
- 启动django项目
步骤:开设接口、获取数据、发送数据、校验数据、录入数据、重定向
- 路由层urls.py(开设接口)
- 视图层views.py(设置注册功能)
templates文件夹下面写注册页面的html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
<script src="{% static 'js/jquery.min.js' %}"></script>
<script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<form action="" method="post">
<p>
<h1>注册用户</h1>
</p>
<p>username:
<input type="text" name="username" class="form-control">
</p>
<p>password:
<input type="text" name="password" class="form-control">
</p>
<p>
<input type="submit" value="注册" class="btn btn-success btn-block">
</p>
</form>
</div>
</div>
</div>
</body>
</html>
效果展示:
开始:
结束:
路由层urls.py(开设接口)
视图层views.py(设置数据展示功能)
templates文件夹下面写登录页面的html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
<script src="{% static 'js/jquery.min.js' %}"></script>
<script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<h1 class="text-center">用户数据展示</h1>
<table class="table table-striped table-hover">
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>pwd</th>
<th>age</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for user in usershu %}
<tr>
<td>{{ user.id }}</td>
<td>{{ user.name }}</td>
<td>{{ user.pwd }}</td>
<td>{{ user.age }}</td>
<td>
<a href="/eidt/?user_id={{ user.pk }}" class="btn btn-success btn-xs">编辑</a>
<a href="/delete/?user_id={{ user.pk }}" class="btn btn-danger btn-xs">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
展示效果
路由层urls.py(开设接口)
视图层views.py(修改功能)
templates文件夹下面写登录页面的html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>修改页面</title>
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
<script src="{% static 'js/jquery.min.js' %}"></script>
<script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<form action="" method="post">
<p>
<h1>修改用户</h1>
</p>
<p>username:
<input type="text" name="username" class="form-control" value="{{ user_data.name }}">
</p>
<p>password:
<input type="text" name="password" class="form-control" value="{{ user_data.pwd }}">
</p>
<p>
<input type="submit" value="修改" class="btn btn-success btn-block">
</p>
</form>
</div>
</div>
</div>
</body>
</html>
展示效果
修改之后的数据
路由层urls.py(开设接口)
视图层views.py(设置登录功能)
如果是软删除要添加查询条件查询所有数据
数据展示
操作之后的效果
6、总结
1. 查询:把数据表中所有的数据展示到页面上
select * from user; # filter-------->where
res=models.表名.objects.filter(查询条件).all() # 查询所有的数据
res=models.表名.objects.filter() # 查询所有的数据
# res-------->queryset对象--------->[对象,对象1]
'''我们可以直接对queryset对象进行循环处理'''
# filter()里面可以直接写查询条件,如果有多个条件是and关系
2. 增加
models.表名.objects.create(**kwargs)
models.表名.objects.create(username=username,password=password)
# 用户注册,往数据表中添加数据
# 第二种方式
res=models.类名(username=username,password=password)
res.save()
3. 修改
models.表名.objects.filter(username=username,password=password).update(**kwargs)
# 第二种方式修改
res=res=models.表名.objects.filter().first() # --------->对象
res.username = username
res.password = password
res.save()
'''用在修改数据上面,修改一条记录的逻辑是什么?'''
# 1. 先给修改的按钮添加一个地址,地址后面要跟个参数(id)
<a href='/index/?id=1'>
<a href='/index/?id={{user_obj.pk}}'>
# 2. 把参数id提交到后端,后端通过GET形式接收参数id,拿到这个id之后,去查询记录
# 3. 把查询出来的字段数据给input的value属性,在页面上展示
# 4. 开始进行修改,把新修改的数据提交到后端,并且以POST请求方式,然后,后端在用POST形式,接收新修改的数据,进行更改
4. 删除
# 1. 物理删除
res=res=models.表名.objects.filter().delete()
# 2. 软删除
在表中加一个字段,is_delete-------->默认值0
在删除的时候,把is_delete这个字段的值改为1,做一个更新操作
'''在查询的时候,一定要加上过滤条件,is_delete=0'''
#####################################################################
# 模板语法
# 后端书写
def ab_render(request):
# 第一种方式分配变量到模板中
user_dict = {'username': 'kevin', 'password': 123}
user_dict1 = {'a':1}
# 第二种方式
print(locals()) # 会把该函数局部里面的所有变量都分配到模板文件中
# return render(request, 'ab_render.html', {'user_dict':user_dict, 'user_dict1':user_dict1})
return render(request, 'ab_render.html', locals())
# 前端书写
<body>
{{ user_dict }}
{{ user_dict.username }}
{{ user_dict.password }}
{{ user_dict1 }}
</body>
# 结果是:
{'username': 'kevin', 'password': 123}
kevin
123
{'a':1}
五、Django请求生命周期流程图
结论:如下:
1. 用户在浏览器发起HTTP请求
2. 请求被分发到web服务网关接口
'''
1. 请求来的时候,处理http请求的数据,处理成比较方便取值的格式
2. 响应走的时候,在封装打包数据格式为HTTP格式的,
'''
# 自带的是wsgiref服务器,特点就是支持的并发量小,所以,后续需要改成uwsgi服务器
wsgiref uwsgi ----------------> uWSGI
----------------> WSGI协议
------------------> uwsgi协议
# NGINX服务器,Apache,Tomcat
# 开发人员经常使用的NGINX服务器
3. Django应用
4. 路由层
# 路由与视图函数的对应关系
5. 视图层
# 做相关的功能处理,模板,数据,核心就在视图层
6. 模板层
7. db
总结
以上就是今天要讲的内容,本文仅仅简单介绍了orm的基本使用和Django请求生命周期流程图。