目录
一.模型层及ORM介绍
1.Django配置mysql
2.ORM框架
二.模型
1.数据库迁移
2.模型的创建
3.模型的字段类型
4.字段选项
6.可能的错误
三.ORM操作
1.管理器对象
2.创建数据
3.查询操作
4.更新操作
四.F对象和Q对象
1.F对象
2.Q对象
五.聚合查询和原生数据库操作
1.聚合查询
2.原生数据库操作
3.cursor
一.模型层及ORM介绍
模型层是负责和数据库通信的
1.Django配置mysql
首先下载对应软件
sudo apt install python3-dev default-libmysqlclient-dev mysql-server sudo pip3 intall mysqlclient
然后在数据库中创建与项目同名的数据库
create database name
在settings.py中的DATAbase配置
ENGINE:sqlite3变为mysqlNAME:数据库名称USER:数据库登录名称PASSWORD:用户密码HOST:ipPOST:端口(默认3036)
2.ORM框架
ORM即对象关系映射,通过使用类和对象来操作数据库
优点:
面向对象编程,不需要写SQL语句实现了数据模型与数据库的解锁,屏蔽了不同数据库之间的差异
缺点:
对于复杂业务,使用成本高根据对象转换weiSQL语句,会有性能损失
映射图:
二.模型
模型是一个python类,他是由django.db.models.Model派生出来的子类
每一个模型对应一张表每一个类属性对应一个字段每一个对象对应一条记录
1.数据库迁移
每当一个模型增加,字段增加等对表结构操作时都需要进行数据库的迁移
##创建一个应用,在应用下的modles.py中进行ORM操作后
在manage.py同名目录下:
python3 manage.py makemigrations //生成迁移文件,将modles.py的文件生成一个中间文件,保存在migrations文件夹中
python3 manage.py migrate //执行迁移程序实现迁移,将每个应用下的migerations文件同步会数据库
2.模型的创建
#app下的models.py
from django.db import models
class 模型名(models.Model):
字段名=models.字段类型(字段选项)
3.模型的字段类型
DateField():date,日期BooleanField():tinyint,真假CharField():varchar,字符串EmailField():varchar,字符串IntegerField():int,整数DecimalField():decimal(x,y),小数DateTimeField():datetime(6),日期和时间FloatField():double,小数ImageField():varchar(100),用来保存图片的地址TextField():longtext,不定长的字符数据
注意:
CharField():必须指定max_length参数的值DateField():三个参数只能选一个,1.auto_now:每次保存对象时,自动设置为当前时间 2.auto_now_add:取第一次被创建出来的时间 3.default:取值(设置当前时间)DecimalField():max_digits:位数总数,包含小数点后的位数 decimal_places:小数位数
4.字段选项
创建字段的额外信息,允许多个选项
primary_key:设置主键,如果有张表没有设置主键,那么会自动生成id自增主键blank:设置为True,字段可以为空,设置为False时,必须填写null:设置为True,允许为空,默认为False和default连用dafault:默认值,和null=False连用。设置后在数据库中显示为null,原因是django会在程序内部加入默认值,而不会去改变数据库db_index :如果设置为True,将添加索引unique:若为True,添加唯一性约束db _column:指定字段名,不采用则为属性名verbose_name :设置此字段在admin界面上的显示名称
5.meta类
使用meta类来给模型赋予属性(表)
例如:表名默认为app名称+class的名称小写
但是可以在类内部再创建一个meta类
class Mate:
#数据库界面
db_table='表名'
#admin后台页面
verbose_name='单数名'
verbose_name_plural='复数名'
6.可能的错误
三.ORM操作
基本操作就是增删改查,核心是操作模型类. 管理器对象
1.管理器对象
每个继承于models.Model的模型类,都有一个objects对象同样被继承下来,这个对象被称为管理器对象
class book(models.Model):
.....
book.objects.create(..) #objects是管理员对象
2.创建数据
Django把数据库的数据表示为python对象
方案一:
book.objects.create(属性:值,属性:值 ....)
方案二:
obj=book(属性:值....) obj.属性=值 obj.save() #必须要save
注:启动python3 manage.py shell 可以代替views来直接调试,改变代码重启
3.查询操作
book.objects.方法
all():查询所有数据,返回QuerySetvalues(’列‘,‘列’):查询指定列,返回QuerySet,内部存字典values_list(‘列’,‘列’):查询指定列,返回QuerySet,内部存元组order_by('-列','列'):排序输出,-表示降序filter(属性=值,属性=值):返回QuerySet,逗号隔开表与操作exinclude(条件):不包含此条件的数据get(条件):只能返回一条数据,如果多余一条或没有数据都报错
查询介词
更灵活的进行条件查询,book.objects.filter(字段--查询介词=值或范围)
__exact__contains__startswith__endswith__gt__gte__lt__lte__in__range
4.更新操作
更新单个数据:
首先查询得到数据,然后通过对象.属性修改数据,最后一定要对象.save()保存
批量更新数据:
查询数据并存储返回的QuerySet,然后储存变量.update(属性=值)
删除单个数据或批量数据:
查询数据并存储返回的QuerySet或单个对象,调用对象.delete()方法
四.F对象和Q对象
1.F对象
一个F对象代表数据库某条记录的字段的信息
作用:
通常是对于数据库的信息在不获取的情况下操作用于字段间的比较
语法:
from django.db.models import F
F('列名')
例(点赞数更新)
2.Q对象
在进行与和非运算时需要使用Q对象
from django.db.models import Q book.objects.filter(Q(price__lt=20)|Q(num__lte=3))
五.聚合查询和原生数据库操作
1.聚合查询
导入:
from django.db.models import *
整表聚合查询:
语法:
book.objects.aggregate(结果变量名=聚合函数(‘列’))
聚合函数:
Sum()Count()Avg()Max()Min()
分组聚合查询:
语法:
QuerySet.annotate(结果变量名=聚合函数(‘列’))
2.原生数据库操作
语法:
book.objects.raw('SQL'%(用户传的参数))
缺点:小心SQL注入
完善:
book.objects.raw('sql',[用户传的参数])
3.cursor
完全跨越ORM进行操作数据库
语法:
from django.db import connection
with connection.cursor() as cur
cur.execute('sql','参数')



