模型成员
类属性:
隐藏的类属性:
object:是Manager类型的一个对象,作用是与数据库进行交互
当定义模型类是没有指定管理器,则Django为模型创建一个名为objects的管理器
自定义管理器:
stuObj = models.Manager()
自定义管理器Manager类:模型管理器是Django的模型进行与数据库交互的接口,一个模型可以有多个模型管理器
作用:
向管理器类中添加额外的方法
修改管理器返回的原始查询集:
重写get_queryset()方法:
class StudentsManager(models.Manager):
def get_queryset(self):
return super(StudentsManager, self).get_queryset().filter(isDelete=False)
class Students(models.Model):
stuObj = models.Manager()
stuObj2 = StudentsManager()
创建对象:
目的:向数据库中添加数据
当创建对象时,Django不会对数据库进行读写操作,当调用save()方法时才与数据库交互,将对象保存到数据库中
注意:__init__方法已经在父类models.Model中使用,在自定义的模型中无法使用
方法:在模型类中增加一个类方法:
@classmethod
def createStudent(cls, name, age, gender, contend, grade, lastT, createT):
stu = cls(sname=name, sage=age, sgender=gender, scontend=contend, sgrade=grade, lastTime=lastT, createTime=createT)
return stu
在定义管理器中添加一个方法:
class StudentsManager(models.Manager):
def get_queryset(self):
return super(StudentsManager, self).get_queryset().filter(isDelete=False)
def createStudent(self, name, age, gender, contend, grade, lastT, createT):
stu = self.model()
stu.sname = name
stu.sage = age
stu.sgender = gender
stu.scontend = contend
stu.sgrade = grade
stu.lastTime = lastT
stu.createTime = createT
return stu
模型查询
概述:
查询集表示从数据库中获取的对象的集合
查询集可以有多个过滤器
过滤器就一个函数,基于所给的参数限制查询结果
从SQL角度来说,查询集和select语句等价,过滤器就相当于where条件
查询集:在管理器上调用过滤器方法返回查询集
查询集经过过滤器筛选后返回新的查询集,所以可以写成链式调用
惰性执行:
创建查询集不会带来任何数据的访问,直到调用数据库时,才会访问数据
直接访问数据的情况:
迭代、序列化、与if合用
返回查询集的方法称为过滤器:
all():返回查询集中所有的数据
filter():返回符合条件的数据
filter(键=值,[键=值])
filter(键=值).filter(键=值)
exclude():过滤掉符合条件的数据
order_by():排序
values():一条数据就是一个对象(字典),返回一个列表
返回单个数据:
get():返回一个满足条件的对象
注意:如果没有找到符合条件的对象,会引发一个异常(模型类.DoesNotExist)
如果找到多个对象,会引发一个异常(模型类.MultipleObjectsReturned)
count():返回当前查询集中的对象个数
first():返回查询集中第一个对象
last():返回查询集中最后一个对象
exist():判断查询集中是否有数据,如果有返回True
限制查询集:
查询集返回列表,可以使用下标的方法进行限制,相当于SQL中饿limit语句
注意:下标不能是负数
def StudentOrderFive(request):
studentList = Students.stuObj2.all()[0:5]
return render(request, 'MyApp/Students.html', {"students": studentList})
查询集的缓存:
每个查询集都包含一个缓存,来最小化的对数据库访问
在新建的查询集中,缓存首次为空,第一次对查询集求值,会发生数据缓存,Django会将查询出来的数据做一个缓存,并返回查询结果,以后的查询直接使用查询集的缓存
字段查询:
概述:
实现了where语句,作为方法filter(),exclude(),get()的参数
语法:属性名称__比较运算符=值
外键:属性名_id
转义:like语句中使用%是为了匹配占位,匹配数据中的%(where like '%')
filter(sname__contains='%'
比较运算符:
exact:判断,区分大小写
contains:是否包含,区分大小写
studentList = Students.stuObj2.filter(sname__contains="成")
startswith、endswith:以value开头或结尾,区分大小写
以上四个在前面加上i,就表示不区分大小写
isnull、isnotnull:是否为空,filter(sname_isnull=False)
in:是否包含在范围内
studentList = Students.stuObj2.filter(pk__in=[2, 4, 6, 8])
gt:大于
gte:大于等于
lt:小于
lte:小于等于
year:年
studentList = Students.stuObj2.filter(lastTime__year=2020)
month:月
day:天
hour:小时
minute:分钟
second:秒
跨关联查询:
处理join查询
语法模型类名__属性名__比较运算符
gradeList = Grades.objects.filter(students__sname__contains="成龙")
print(gradeList)
查询快键:pk:代表主键
聚合函数:
使用aggregate():函数返回聚合函数的值
Avg():平均值
Count():数量和
Max():最大值
from django.db.models import Max,Min
maxAge = Students.stuObj2.aggregate(Max('sage'))
Min():最小值
Sum():累计和
F对象:
可以使用模型的A属性与B属性进行比较
from django.db.models import F, Q
g=Grades.objects.filter(gboynum__gt=F('ggirlnum '))
支持F对象的算数运算
g=Grades.objects.filter(gboynum__gt=F('ggirlnum ')+20)
Q对象:
过滤器的方法中的关键字参数,条件为And模式
需求:进行or查询
解决:使用Q对象
studentList = Students.stuObj2.filter(Q(pk__lte=3) | Q(sage__gt=25))
studentList = Students.stuObj2.filter(~Q(pk__lte=3))