模型
ORM的理解
- ORM概念
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
ORM在业务逻辑层和数据库层之间充当了桥梁的作用。
- ORM由来
让我们从O/R开始。字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。
几乎所有的软件开发过程中都会涉及到对象和关系数据库。在用户层面和业务逻辑层面,我们是面向对象的。当对象的信息发生变化的时候,我们就需要把对象的信息保存在关系数据库中。
按照之前的方式来进行开发就会出现程序员会在自己的业务逻辑代码中夹杂很多SQL语句用来增加、读取、修改、删除相关数据,而这些代码通常都是重复的。
- ORM的优势
ORM解决的主要问题是对象和关系的映射。它通常把一个类和一个表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。
ORM提供了对数据库的映射,不用直接编写SQL代码,只需像操作对象一样从数据库操作数据。让软件开发人员专注于业务逻辑的处理,提高了开发效率。
定义模型
模型,属性,表,字段之间的关系:
一个模型类在数据库中对应一张表,在模型类中定义的属性,对应该模型对照表中的一个字段
定义属性
创建模型类
元选项
在模型类中定义Meta类,用于设置元信息
示例:
class Meta:
db_table = "students"
ordering = ['id']
db_table
定义数据表名,推荐用小写字母,数据表名默认为项目名小写_类名小写
ordering
对象的默认排序字段,获取对象的列表时使用
示例:
ordering['id'] id按升序排列
ordering['-id'] id按降序排列
注意:排序会增加数据库开销
模型成员
- 类属性
- object是Manager类型的一个对象,作用是与数据库进行交互,当定义 模型类是没有指定管理器时,则django会为模型创建一个名为objects的管理器。
- 若用户想要自定义管理器:
# 自定义模型管理器后,object就不存在了
stuObj = models.Manager()
- 自定义管理器Manager类
class StudentsManager(models.Manager):
def get_queryset(self):
return super(StudentsManager, self).get_queryset().filter(isDelete=False)
- 模型管理器是django的模型进行与数据库进行交互的,一个模型可以有多个管理器
- 作用:
- 向管理器中添加额外的方法
- 修改管理器中返回的原始查询集,重写get_queryset()方法
- 创建对象
- 创建对象的目的是为了能向数据库进行数据添加
- 当创建对象时,django不会对数据库进行操作,当调用save()方法后才与数据库进行交互,将对象保存到数据库。
- 模型中添加一个类方法
# 定义一个类方法创建对象
@classmethod
def createStudent(cls,name,age,gender,contend,grade,isD=False):
stu = cls(sname=name,sage=age,sgender=gender,scontend=contend,sgrade=grade,isDelete=isD)
return stu
- 管理器中添加一个方法
def createStudent(self,name,age,gender,contend,grade,isD=False):
stu = self.model()
stu.sname = name
stu.sage = age
stu.sgender = gender
stu.sgrade = grade
stu.isDelete = isD
return stu
3.4两种方法皆可被调用进而创建对象
- 查询对象
- 在管理器上调用过滤器方法返回查询集
- 查询集经过过滤器筛选后返回新的查询集,所以可以写成链式调用
- 惰性执行(创建查询集不会带来任何数据的访问,直到调用数据才会访问)
- 直接访问数据的情况:
1. 迭代
2. 序列化
3. 与if合用 - 返回查询集的方法称为过滤器
1. all():返回查询集中的所有数据
2. filter():保留符合条件的数据
3. filter(键=值)
4. filter(键=值,键=值)
5. filter(键=值).filter(键=值) 且的关系
6. exclude():过滤掉符合条件的
7. order_by():排序
8. values():一条数据就是一个字典,返回一个列表
9. get()返回一个满足条件的对象 注意:如果没有找到符合条件的对象,会引发模型类.DoesNotExist异常;如果找到多个对象,会引发模型类MultipleObjectsReturned异常
10. count():返回查询集中对象的个数
11. first():返回查询集中第一个对象
12. last():返回查询集中最后一个对象
13. exits():判断查询集中是否有数据,如果有数据返回 True,否则返回 False. - 限制查询集
查询集返回列表,可以使用下标的方法进行限制,等同于sql中的limit语句
注意:下标不能是负数
示例:studentsList = Students.stuObj2.all()[0:5] - 查询集的缓存
概述: 每个查询集都包含一个缓存,来最小化对数据库的访问在新建的查询集中,缓存首次为空,第一次对查询集求值,会发生数据缓存,Django会将查询出来的数据做一个缓存,并返回查询结果。以后的查询直接使用查询集的缓存
字段查询
- 概述
- 实现了sql中的where语句,作为方法filter(),exclude(),get()的参数
- 语法:属性名称__比较运算符=值
- 外键:属性名称_id
- 转义:类似sql中的like语句,like有关情况看我哥他%是为了匹配点位,匹配数据中的%使用(where like “%”),filter(sname__contains="%")
- 比较运算符
- exact:判断:大小写敏感
-filter(isDelete=False) - contains:是否包含,大小写敏感
-studentsList = Students.stuObj2.filter(sname__contains=“孙”) - startswith,endswith:以value开头或结尾,大小写敏感
( 以上四个在前面加上i,就表示不区分大小写iexact,icontains,istartswith,iendswith) - isnull,isnotnull:是否为空
-filter(sname__isnull=False) - in:是否包含在范围内
- gt大于,gte大于等于,lt小于,lte小于等于
- year,month,day,week_day,hour,minute,second
-studentsList = Students.stuObj2.filter(lastTime__year=2017)
- exact:判断:大小写敏感
- 跨关联查询
- 聚合函数
- 使用aggregate函数返回聚合函数的值
Avg
Count
Max
1. maxAge = Student.stuObj2.aggregate(Max(‘sage’))
2.maxAge为最大的sage。
Min
Sum - F对象
可以使用模型的A属性与B属性进行比较:
from django.db.models import F,Q
def grades1(request):
g = Grades.objects.filter(ggirlnum__gt=F('gboynum'))
print(g)
# [<Grades: python02>,<Grades: python03>]
return HttpResponse("OOOOOOOo")
支持F对象的算术运算
g = Grades.objects.filter(ggirlnum__gt=F('gboynum')+20)
- Q对象
概述:过滤器的方法的关键字参数,条件为And模式
需求:进行or查询
解决:使用Q对象
studentsList = Students.stuObj2.filter(Q(pk__lte=3) | Q(sage__gt=50))
return render(request, 'myApp/students.html', {"students": studentsList})
只有一个Q对象的时候,就是用于正常匹配条件studentsList = Students.stuObj2.filter(~Q(pk__lte=3))
~Q是取反