orm简单相关操作
orm简单相关操作
-
django主要文件
mysite项目文件夹 mysite同名文件夹 settings.py # 配置文件 urls.py # 存放路由和视图函数对应关系 应用文件夹(可以有多个) migrations文件夹 # 里面存放ORM针对数据库相关的记录 apps.py # 每个应用的独立标识 admin.py # django自带的后台管理功能 views.py # 该app对应的主体功能(函数 类) models.py # 与数据库打交道的文件(ORM) sqlite3 # django自带的数据库 manage.py #启动文件 templates文件夹 #对应的html文件 """ urls.py 路由层 views.py 视图层 templates 模板层 models.py 模型层 """
-
小白必会三板斧
HttpResponse 主要返回文本类型的数据 render 主要返回html文件(还支持模板语法) render(request,'index.html',{'name':"jason"}) render(request,'index.html',locals()) redirect 重定向(全称网址、后缀)
-
静态文件资源及配置
常见静态文件资源 css文件 js文件 图片文件 第三方框架文件 针对静态文件资源也是需要单独存档在某个位置 static目录 css文件夹 js文件夹 img文件夹 others文件夹 """ django后端你之所以能够访问到相应的资源是因为提前开设了相应的接口 urls.py 路由层 """ STATIC_URL = '/static/' # 接口前缀 STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static') # 文件路径 ] 静态文件资源动态绑定 {% load static %} # 类似于import static src={% static 'aaa/a.txt'%}
-
网络请求方法
# url:统一资源定位符 GET 索要数据 get请求也可以携带额外的参数但是有大小限制 并且是在url中携带 url?xxx=yyy&aaa=bbb POST 提交数据 post请求一般携带的都是敏感性数据 数据没有大小限制并且存储在请求体
-
request对象方法
request.method # 纯大写的字符串 request.POST # 用户post请求提交的普通数据 .get() .getlist() request.GET # 获取url问号后面的数据(不分请求) .get() .getlist()
-
pycharm链接MySQL
使用pycharm链接一款之前从来没有链接过的数据库一定要先下载对应的驱动 针对MySQL的链接pycharm会提供两个驱动 如果一个不行就换另外一个
-
django链接MySQL
1.配置文件中 DATABASES = { ... 'USER' 'PASSWORD' 'HOST' 'PORT' 'NAME' 'CHARSET' } 2.针对python3.6及以下解释器还需要添加一个额外的代码 import pymysql pymysql.install_as_MySQLdb() # 可以直接点出来 不需要过分记忆
1.django orm简介
2.orm创建表
两个重要命令数据库迁移命令 反向迁移
3.orm字段增删改查
4.orm记录增删改查
5.orm外键的创建
1.django orm简介
# 什么是ORM?
ORM:对象关系映射
# 为什么要用ORM?
能够让不会写SQL语句的python程序员
使用面向对象的语法即可简单快捷的操作MySQL,极大地提升开发效率
'''但是ORM有时候自动生成的SQL效率可能会很低'''
类 -------- 表
对象 -------- 一行行记录
对象点属性 ----- 记录某个字段对应的值
# 如何使用ORM?
在django应用文件夹下的models.py中操作
"""orm无法创建库 需要自己提前创建好"""
2.orm创建表
1.先在modles.py 创建类相关代码
class Lol(models.Model): #create table Lol
id = models.AutoField(verbose_name='编号',primary_key=True) # id int primary key auto_increment comment '编号'
name=models.CharField(verbose_name='姓名',max_length=32) #name varchar(32) comment '姓名'
pwd=models.IntegerField(verbose_name='密码') #pwd int comment '密码'
# verbose_name ==comment 可以省略其实
#写完这个发现数据库db123 自动创建了一个 django_migrations 不重要这个就是一个记录表
django_migrations
2.执行数据库迁移命令(也可以说同步更准确)
python3 manage.py makemigrations #先记在小本本上migrations
'''
Migrations for 'app01':
app01\migrations\0001_initial.py
- Create model Lol
打开migrations 发现多了一个文件 0001_initial.py
他记录着 操作数据库的记录
执行后 不会对数据库有影响 他只是记一下
'''
执行第二条命令 真正操作数据库的
python3 manage.py migrate
'''
django会有很多app 相同app表名不重复 所以加了一个前缀app的名字
Lol mysql不区分大小写 表名变层了lol
主键字段orm会自动创建 只不过名字固定为id
CharField字段类型必须要有max_length参数相当于varchar(里面必须指定大小)
pycharm快捷提示(tools>>>run manage.py task)
'''
3.orm字段增删改查
增删改查 直接该语句 然后重新迁移数据库就ok了 但是注意如果里面有数据 添加新字段要注意 他不知道原来的数据的新添加的字段的值是多少
可以通过两种方式解决 添加字段时候设置可以为空 那么之前那个数据的新添加的字段就是null
第二种方式 添加字段时候 设置default 默认值 之前的
# 当表中已经有数据存在的情况下如果添加新的字段那么需要设置null或者default
password = models.IntegerField(verbose_name='密码',null=True) # pwd int comment '密码'
age = models.IntegerField('年龄',default=18)
4.orm数据增删改查
from app01 import models ## 导入模块
查
# 模块名.表名.objects.
models.Lol.objects.all() #等于 selecr * from lol 返回的是 列表套数据对象
<QuerySet [<Lol: uzi>, <Lol: ming>, <Lol: jacklove>]> # 拿到这个数据对象 可以通过点字段名的方式获取对应字段的值
models.Lol.objects.filter(name='uzi') #select * from lol where name='uzi' filter=where
<QuerySet [<Lol: uzi>]>
lol_obj=models.Lol.objects.filter(name='uzi')[0] 得到的死一个数据对象 不加[0]得到的是一个列表套数据对象
lol_obj.name
lol_obj.id
models.Lol.objects.filter(name='uzi',pwd='123') #多个条件查询 and
增
models.Lol.objects.create(name='doinb',pwd='333') #insert into lol(name,pwd) values('doinb',333)
<Lol: doinb> #返回你新增的数据对象本身 可以通过点字段名的方式获取对应字段的值
-----------------------------------------------------------------------------
obj=models.Lol(name='tian',pwd='555') #这种方式先创建对象 因为类加括号 生成一个对象 这个对象可以直接点字段名的方式获取对应字段的值 产生对象之后 如果写错了 可以直接修改 只要没save 可以多次修改 没有提交到数据库 代码层面的操作
obj.name
'tian'
#这个方法只是类产生对象 不会加到mysql 里 如果想加到mysql里需要
obj.save() #保存到数据库
删
models.Lol.objects.filter(id='5').delete() #filter = where 一定要写 不然这个表全部删除
(1, {'app01.Lol': 1}) #返回受影响的行
改
#傻瓜操作 先查询处理 在修改
edit_obj = models.Lol.objects.filter(id=3)[0]
edit_obj.name = 'ning'
edit_obj.save()
models.Lol.objects.filter(name='uzi').update(name='uzi666')
1 #返回受影响的行数
5.小练习
中文概念版
#首页
1.去settings 里配置
app注册
把tmeplates加入到全局
配置一下DATABASES
静态文件路径配置
2.models模型层里添加表
3.设置urls 添加数据展示页
4.设置views 添加对应函数(首页) 记得先导入三板斧
4.1查询表全部数据
4.2将数据传给前端 前端用bootstrap设置好看一点 传给他一个queryset 列表套数据格式
4.3前端通过传过来的数据 展示在前端
#注册
1.先写对应关系 urls
2.到views视图层里 创建对应视图 return 一个html文件
3.注册应该是在主界面点一个按钮跳转到注册页面,所以主界面加上一个a标签注册 ,跳转到网址href='/register/' 会在url后面添加一个register 本机:端口/urls里面的
4.修改html文件register.html 两个输入框 设计设计格式 一个注册完成按钮 这个要给后端发送数据 目前要用form 把数据包起来(action 不指定默认传给当前页面,相当于再调一次register方法 ) 记得输入框name指定 不染相当于字典没有key 传不过去, 在register 方法可以通过request.method判断请求等于post怎么做 通过request.POST.get(key)获取post请求传过来的参数,通过name去数据库查询 是否有这个数据 返回一个结果,结果true 有 则用户名已存在 返回false 添加数据 并且重定向 主界面
#删除
1.在主界面 屁股后加俩按钮编辑 删除
2.点击删除 应该传给后端主键值 href 应该重定向到 新加的数据删除页后缀 然后get请求传给views删除函数 选择这一行的id 问号xxx=xxx形式传给他
3.先写urls 数据删除页
4.views 删除函数
4.1获取用户需要删除的数据主键值 通过get请求获取他问号后面传给我们的值
4.2有主键值 直接删除 并重定向home页面
#编辑修改
大体思路:点了编辑之后应该跳转到一个页面 这个页面有编辑的数据 ,编辑完成点击保存 再跳转到主界面
1.新增urls 数据编辑页 和 views 数据编辑函数
2.主页面 新增按钮 get请求 发给后端一个id
3.后端根据这个id获取具体数据记得加first 因为 获取的是列表套数据对象 需要指定索引获取第一个元素 (推荐使用first方法) 不直接指定[0]索引
4.返回给用户一个页面render
代码版
#视图层
def home (request):
obj_list=models.Lol.objects.all() #获取全部数据 obj是一个列表套字典
return render(request,'home.html',locals())
def register(request):
if request.method == 'POST':
username=request.POST.get('username')
password=request.POST.get('password')
#先比对用户名是否重复
is_exits=models.Lol.objects.filter(name=username)
if is_exits:
return HttpResponse('用户名已存在')
#不存在则添加数据
models.Lol.objects.create(name=username,pwd=password)
#返回home页面
return redirect('/home/')
return render(request,'register.html')
# return redirect('/register/')
def date_delete(request):
date_id=request.GET.get('date_id')
models.Lol.objects.filter(id=date_id).delete()
return redirect('/home/')
def date_edit(request):
date_id=request.GET.get('date_id')
username=request.POST.get('username')
password=request.POST.get('password')
if request.method=='POST':
models.Lol.objects.filter(id=date_id).update(name=username,pwd=password)
return redirect('/home/')
obj=models.Lol.objects.filter(id=date_id).first()
return render(request,'date_edit.html',locals())
#模型层
from django.db import models
# Create your models here.
class Lol(models.Model): #create table Lol
id = models.AutoField(verbose_name='编号',primary_key=True) # id int primary key auto_increment comment '编号'
name = models.CharField(verbose_name='姓名',max_length=32) #name varchar(32) comment '姓名'
pwd = models.IntegerField(verbose_name='密码') #pwd int comment '密码'
# verbose_name ==comment 可以省略其实
# age = models.IntegerField(verbose_name='年龄',default=18)
def __str__(self):
return self.name
render和redirect 的区别
render
返回给前端一个html页面 还可以提供模板语法
redirect
重定向一个网页,比如www.baidu.com 还可以不写全称直接'/index/' 默认会在前面加上本机ip加端口
指向这个网址 相当于去找这个对应关系 然后找这个函数 执行函数里的
6.orm外键的创建
一对多外键关系
"""在orm中 外键字段建在多的一方"""
多对多外键关系
"""在orm中 可以直接写在查询频率较高的表中(自动创建第三张表)"""
一对一外键关系
"""在orm中 直接写在查询频率较高的表中"""
# 一对多
publish = models.ForeignKey(to='Publish')
# 多对多
authors = models.ManyToManyField(to='Author') # 自动创建书籍和作者的第三张关系表
# 一对一
author_detail = models.OneToOneField(to='AuthorDetail')
"""
ForeignKey OneToOneField 会自动给字段加_id后缀
"""
class Book(models.Model): #书籍表
title = models.CharField(max_length=32)
price= models.DecimalField(max_digits=8,decimal_places=2) #总共八位 小数位占两位
#一对多 多的一方的外键
publish=models.ForeignKey(to='Publish') #自动关联出版社的主键字段 后面还有参数to_filed='跟哪个自动关联' 不写默认主键
#多对多 写在查询频率较高的表中
authors=models.ManyToManyField(to='Author') #自动创建书籍表和作者的第三章张表
class Publish(models.Model): #出版社表
title = models.CharField(max_length=32)
class Author(models.Model): #作者表
name = models.CharField(max_length=32)
#一对一 onetoone
author_detail=models.OneToOneField(to='AuthorDetail')
class AuthorDetail(models.Model): #作者详情表
addr = models.CharField(max_length=32)
phone=models.BigIntegerField()
#数据库迁移后
多对多自动创建第三张表 也会自动加_id
一对多和,一对一 外键字段创建自动加_id pycharm他会自动加