Day 56 Django 连接数据库 ORM
文章目录
1、静态文件 及相关配置
我们在访问django框架资源的使用之所以可以拿到数据 是因为提前在urls.py 中开设了相应的资源接口 如果访问不到资源 那么就是没有开设相应的接口
1.1、静态文件
html项目上使用的不经常改变的资源
- 第三方框架文件
- css文件
- js文件
- 图片文件
针对静态文件资源一般都会放在static文件夹内
1.2、分类管理
当static目录下出现了很多不同类型的静态文件资源 那么还可以分类管理
- others文件
- 第三方框架文件
- css文件夹
- 所有的css文件
- js文件夹
- 所有的js文件
- img文件夹
1.3、接口 资源 配置
针对静态文件资源的访问也需要提前开设相应的接口
STATIC_URL = '/static/' #这个是 接口前缀 与文件名无关
静态文件资源配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
] #可以理解为将 static 静态文件夹 添加至pycharm环节变量
动态解析
自动 识别接口前缀 加到地址中
{% load static%} #
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
2、请求方法
URL:统一资源定位符(网址)
2.1、GET请求
朝别人索要数据
-
也可以携带额外的数据
url?xxx=yyy&zzz=oo&aaa=bb 通过 网址后面跟问好 通过双打等号形式携带数据 后端获取为 键值对
-
上述携带数据的方式有两个限制
- 数据只能是游戏额无关紧要的非敏感数据
- 数据的大小有限制 2kb-4kb左右
- GET请求没有请求体(HTTP数据格式)
2.2、POST请求
朝别人提交数据
- 也可以携带额外的数据
- 数据都是放在请求体中 并且数据大小没有限制
**form表单默认的数据提交方式是GET
**
<form action="" method="post"></form> action 控制数据的提交地址
action 数据的提交地址填写方式
方式一:不写 朝当前页面所在的地址提交
方式二:写后缀 /index/
自动补全ip和port
方式三:写全称 https://www.baidu.com/
提交post请求 前期 返回403状态码 需要去配置文件中注释一行代码
MIDDLEWARE = [
# 'django.middleware.csrf.CsrfViewMiddleware',
]
3、request对象方法
def login(request):
if request.method=='GET': #判断 请求方式
return render(request,'login.html') 直接 返回主页
print(request.method) #POSt 提交数据 确实 POST方式
print(request.POST) #查看 POST请求体代码
return HttpResponse('hahahh')
方法 | 功能 |
---|---|
request.method | 获取请求方式 结果是纯种大写的字符串 |
request.POST | 获取POST请求发送来的普通数据(不包含文件) |
request.POST.get() | 默认只获取列表中最后一个数据 |
request.POSt.getlist() | 获取键对应的整给列表 无论有几个数据值 |
request.GET | 获取url后面携带的非敏感数据(不是 单单获取get请求携带的参数) |
request.GET.get() | 默认只获取列表中最后一个数据值 |
request.GET.getlist() | 获取键对应的整个列表 无论有几个数据值 |
4、连接MySQL
4.1、pycharm连接MySQL
- pycharm与上方侧边 database
- pycharm左下方边角 database
上述两个地方都没有 下载插件 或重装pycharm
首次连接数据库需要下载对应的驱动
连接数据库时 先测试连接
4.2、django连接MYSQL
django默认使用的是sqlite3 但是这款数据库 一般用于本地测试 功能很少
在配置文件 修改配置
#将原本 sqlite3的 配置 给注释掉
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', #指定数据库软件名称
'NAME':'html_db', #指定库名
'USER':'ROOT',
'PASSWORD':'123',
'HOST':'127.0.0.1',
'PORT':3306,
'CHARSET':'UTF8'
}
}
指定链接MySQL的模块
django1.11 版本需要在项目或者应用目录下的__init__.py中编写一行代码
import pymysql
pymysql.install_as_MySQLdb()
django2.2 以上版本需要使用mysqlclient模块
5、django orm
ORM:对象关系映射
python | 映射成 | sql |
---|---|---|
类 | 映射成 | 表 |
对象 | 映射成 | 记录 |
对象点属性 | 映射成 | 字段对应的值 |
ORM的存在可以让不会MYSQL的python程序员 使用python的语法简单快捷的操作MySQL
5.1、创建表
先去应用 目录下的 models.py编写模型类
class User(models.Model):
# id int primary key auto_increment
id = models.AutoField(primary_key=True)
# name varchar(32)
name = models.CharField(max_length=32)
# pwd int
pwd = models.IntegerField()
数据库迁移/同步命令
-
将models 中有关数据库的操作记录下来(migrations 文件夹)
python3.7 manage.py makemigrations
-
将操作真正影响到数据库中
python3.7 manage.py migrate
当修改了models中 与数据库相关的代码 都必须执行上述的命令
可以简写 通过Tools 中 Run manage.py Task..
表的主键在orm中 可以不写 orm会自动帮你添加一个id的主键
如果你需要主键的名称不叫id 只能自己创建
当你要删除 创建的字段 直接将此行代码 注释 执行迁移命令 就会将数据库 一起同步修改
5.2、html django sql 用户登录校验
def login(request):
if request.method == 'GET':
return render(request,'login.html')
username=request.POST.get('username') #获取 username对应的列表中 最后一个 值
password=request.POST.get('password') #获取password对应的列表中最后一个值
#select * from App01_User where name=username and pwd=password
user_obj=models.User.objects.filter(name=username,pwd=password).first() # 结果是 列表套对象 first()获取 第一个元素
if user_obj: #判断 对象 是否存在
print(user_obj[0].id)
print(user_obj[0].name)
print(user_obj[0].pwd)
return HttpResponse('hahahh')
6、orm语法
查
models.User.object.filter() #结果可以看成时一个列表套数据对象
如何获取对象? 可以使用first()
方法 如果没有值会返回None 我们if判断即可
增
models.User.object.create(name=username,pwd=password) #注册功能
改
models.User.object.filter(id=1).update(name='jasonNB')
删
models.User.object.filter(id=4).delete( )
7、orm外键关联
一对多
外键字段在多的一方
publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)
多对多
外键字段可以 直接写在某张表中 ORM会自动帮你创建第三张表
authors = models.ManyToManyField(to='Authors')
一对一
外键字段建在铲鲟频率较搞得表中
datail = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)
作业:
views
def Userinfo(request):
if request.method=='GET':
if request.GET.get('us')=='create':
return render(request,'create_info.html')
if request.GET.get('us')=='delete':
id = request.GET.get('id')
models.UserInfo.objects.filter(id=id).delete()
return redirect('http://127.0.0.1:8000/userinfo/')
if request.GET.get('us')=='update':
user_dict=request.GET
return render(request,'update.html',{'user_dict':user_dict})
# print(request.GET)
userinfo = models.UserInfo.objects.filter()
print(userinfo)
return render(request,'user_info.html',{'userinfo':userinfo})
#添加信息
elif request.method == 'POST':
if request.GET.get('us')=='update':
id=request.GET.get('id')
username = request.POST.get('name')
password = request.POST.get('pwd')
models.UserInfo.objects.filter(id=id).update(name=username,pwd=password)
return redirect('http://127.0.0.1:8000/userinfo/')
username=request.POST.get('name')
password=request.POST.get('pwd')
res=models.UserInfo.objects.create(name=username,pwd=password)
print(res)
return redirect('http://127.0.0.1:8000/userinfo/')
user_info.html
<body>
<div class="container">
<div class="row">
<h1 class="text-center">用户信息</h1>
<button class="btn"><a href="http://127.0.0.1:8000/userinfo/?us=create">添加信息</a></button>
<table class="table table-bordered">
<thead>
<tr class="info">
<th>编号</th>
<th>用户名</th>
<th>密码</th>
<th><a >添加信息</a></th>
</tr>
</thead>
<tbody>
{% for user_object in userinfo %}
<tr class="danger">
<td>{{ user_object.id }}</td>
<td>{{ user_object.name }}</td>
<td>{{ user_object.pwd }}</td>
<td><a href="http://127.0.0.1:8000/userinfo/?us=update&id={{ user_object.id }}&name={{ user_object.name }}&pwd={{ user_object.pwd }}">编辑</a> <a href="http://127.0.0.1:8000/userinfo/?us=delete&id={{ user_object.id }}">删除</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</body>
create_info.html
<body>
<div class="container">
<div class="row">
<h1 class="text-center">添加信息</h1>
<form action="http://127.0.0.1:8000/userinfo/" method="post">
<p>用户名:<input type="text" class="form-control" name="name"></p>
<p>密码:<input type="password" name="pwd" class="form-control"></p>
<input type="submit" class="btn btn-info btn-block">
</form>
</div>
</div>
</body>
update.html
<body>
<div class="container">
<div class="row">
<h1 class="text-center">编辑信息</h1>
<form action="http://127.0.0.1:8000/userinfo/?us=update&id={{ user_dict.id }}" method="post">
<p>用户名:<input type="text" class="form-control" name="name" value="{{ user_dict.name }}"></p>
<p>密码:<input type="password" name="pwd" class="form-control" value="{{ user_dict.pwd }}"></p>
<input type="submit" class="btn btn-info btn-block">
</form>
</div>
</div>
</body>