朝花夕拾-Python-Django-学习笔记
朝花夕拾,一个老年人的学习笔记,不妥请指,感谢
学习《Django实战-PythonWeb典型模块与项目开发》张晓/著
文章目录
第二篇 初级篇
第3章 Django ORM
Django有一个显著的特点就是应用ORM理念处理数据,这使django与其他开发语言活动框架明显区别开,ORM(Object Relational Mapping)是对象关系映射,描述Django数据模型类和数据库之间的映射关系,是让一个类和一个数据库表进行对应,ORM在数据库层和业务逻辑层之间起到了桥梁的作用
Django通过类代码描述数据表字段,表见关系等内容,并通过相应命令把类所描述的内容持久化到数据库.
3.1 ORM的特点
3.1.1 ORM的优点
Django ORM通过统一格式的业务逻辑代码操作数据库,把SQL语句统一转换成较为固定的Django语法机构
3.1.2 ORM的缺点
ORM是对SQL实施封装并生成响应的SQL语句来操作数据库,会影响效率
3.1.3 ORM的特征
一个数据模型MODEL映射一个数据库表,就是django.db.models.Model映射到数据库表,类的属性映射为数据库表字段,类的实例对象映射为数据行
ORM能实现操作表,操作行,不能操作库
主要5个步骤
1.在项目中建立数据库
2.settings.py中设置数据库的连接字符
3.在应用程序的models.py中编写继承于models.Model的数据模型
4.运行python manager.py makemigrations \python manage.py migrate两个命令生成数据库表.
5.使用Django ORM操作数据库表
3.2 ORM的使用
ORM优点是屏蔽了不同数据库之间的差异,实现了对数据库表操作的代码一致性,缺点是影响效率.
3.2.1 数据库连接
1.创建test_orm数据库
提示:Django3.6以后的版本只支持Mysql5.7及更高版本
3.2.2 创建数据模型
创建一个group模型,有两个属性,user和email,
在终端运行python manage.py makemigrations
在终端运行python manage.py migrate
登录MYSQL数据库管理端,生成数据表employee_group
1.Django生成数据表时,会把models.py中的类名转化小写,然后在前面加上应用程序的名称和下划线作为数据表名,例如employee_group
2.employee_group数据表中有id,group_name,group_script等三个字段,多出的id字段是自动添加,他作为数据表的主键使用
3.2.3 ORM字段
1.常用字段类型
(1)charfield:字符类型,必须提供max_length,确定字符长度,verbose_name在Django admin管理后台是字段的显示名称,
user = models.CharField(max_length=32,verbose_name='姓名')
(2)Emailfield:邮箱类型,字符类型
email = models.EmailField(verbose_name='邮箱')
(3)Textfield:文本类型,存储打短文本字符串,超过254个字符建议使用
descript = models.DateField(auto_now=True,auto_now_add=False)
(4)Integerfield:整数类型
int = models.IntegerField
(5)datafield:日期字符
data = models.DateField(auto_now=True,auto_now_add=False)
(6)timefield:时间字段
time = models.TimeField(auto_now=False,auto_now_add=False)
(7)datetimefield:日期时间字段
datetime = models.DateField(auto_now=False,auto_now_add=False)
(8)filefield:实际上是字符串类型,用来吧上传的文件的路径保存在数据库中,文件上传到指定目录,主要参数upload_to指明了上传文件的保存路径,这个路径与Django配置文件的MEDIA_ROOT变量值有关
filetest = models.FileField(upload_to='test/')
(9)imagefield:实际上的字符串类型,用来把上传的图片的路径保存在数据库中,图片文件上传到指定目录,主要参数upload_to指明上传图片文件的保存路径,与filefield中upload相同
picture = models.ImageField(upload_to='pic/')
2.常用字段属性
(1)db_index:设置此字段为数据表的索引
(2)unique:数据库表中不能有重复值
(3)default:字段默认值
(4)auto_now_add:新疆爱记录的时间保存为该字段的值
(5)auto_now:每次修改记录时,把当前时间存储到该字段
3.2.4 ORM基本数据操作
基本操作就是增删改查,主要通过数据模型objects属性提供数据操作的接口.
(1)增加记录
第一种方式
new_emp = models.employee.object.create(name=“tom”,email=“tom@163.com”,dep_id=66)
第二种方式
new_emp = models.employee (name=“tom”,email=“tom@163.com”,dep_id=66)
new_emp.save()
(2)删除记录,用filter()过滤出符合条件的记录后调用delete()删除
models.employee.object.filter(name=“张三”).delete()
(3)修改记录
# 将指定条件的记录更新,并更新指定字段的值
models.employee.object.filter(name=“tom”).update(email=“tom2@163.com”)
# 修改单条数据
obj = models.employee.object.get(id=66)
obj.email = “tom2@sina.com”
obj.save()
(4)查询
# 获取全部
Emp_list = models.employee.objects.all()
# 获取单条数据,数据不存在则报错
Emp = models.employee.objects.get(id=123)
# 获取指定条件的记录集
Emp_group = models.employee.objects.filter(name=“张三”)
3.2.5 ORM数据操作常用函数
列举的5个函数返回值都是Query Set对象集,有一个特性就是"惰性",返回值为Query Set的函数不会立即去数据库操作数据,当用到它时,才回去获取数据,如遍历,打印,判断是否有值,才会到数据库中获取数据
(1)all()函数,返回符合条件的全部记录
objects = models.employee.objects.all()
(2)filter()函数,返回指定条件的记录,括号内为过滤条件,类似于sql中where语句
objects = models.employee.objects.filter(name=‘tom’)
filter后面的括号内存放的是过滤条件,针对数据表的字段过滤一般用"字段名+双下划线+条件名词",括号内的过滤条件可以有多个,这些条件是与关机也就是and关系,包括contains,icontains,in,gt,lt,range,startwith,endswith,istartswith,iendswith等.
# 获取name字段包括"tom"的记录
models.employee.objects.filter(name_contains="tom")
# 获取name字段包括"tom"的记录,无视大小写
models.employee.objects.filter(name_icontains="tom")
# 获取表中id等于10,20,66的值
models.employee.objects.filter(id_in="10,20,66")
# 获取表中id不等于10,20,66的记录
models.employee.objects.exclude(id_in="10,20,66")
# 获取表中id大于1且小于10的记录,两个过滤条件的关系是and
models.employee.objects.filter(id_gt=1,id_lt=10)
# 获取表中id的范围在1~66的记录,等价于sql的id bettwen 1 and 66
models.employee.objects.filter(id_range=[1,66])
# 获取表中birthday字段中月份为9月的记录,birthday为日期格式为日期格式
models.employee.objects.filter(birthday_month=9)
(3)exclude()函数,返回不符合括号内条件的记录,与filter()具有相反意
# 获取表中id不等于10,20,66的记录
models.employee.objects.exclude(id_in=“10,20,66”)
(4)order_by()函数,按照order_by后面括号中的字段排序
objects = models.employee.objects.exclude(name=‘tom’.order_by(‘name’))
字段名中加"-",表示该字段倒序排列,代码表示
objects = models.employee.objects.order_by(‘-name’)
(5)distinct()函数,去掉记录集合中完全一样的记录(重复记录),然后返回这个记录集
objects = models.employee.objects.filter (name=‘tom’).distinct()
列举3个函数返回其他类型,
(1)values()函数,返回一个字典类型序列
objects = models.employee.objects.values(‘id’,‘name’,‘emali’)
print(objects)
(2)values_list()函数,返回一个元祖类型序列
(3)get(),first(),last()返回单个对象,返回数据表中的一条记录