对数据表进行增删改查-通过模型类接口ModelsApi来实现的,也就是我们数据库相关的接口,这个接口返回的是个查询集合QuerySet它是一个可迭代对象
#1.查询、检索、过滤
teachers=Teacher.objects.all() #objects是模型类的对象管理器如果没有更改的话是默认的 all()就是取出所有的结果
print(teachers)
teacher2=Teacher.objects.get(nickname="Jack")#get()只能返回一条结果,多条则会报错因此在函数中通常传递的是主键或者是唯一建作为参数
print(teacher2,type(teacher2)) #返回的是一个模型类
teachers3=Teacher.objects.filter(fans__gte=500)#返回的是QuerySet 可以是多条结果
for t in teachers3:print("讲师姓名{}--粉丝数{}".format(t.nickname,t.fans))
#字段数据匹配,大小写敏感
teacher4=Teacher.objects.filter(fans__in=[666,1231])print(teacher4)
teacher5=Teacher.objects.filter(nickname__icontains='A')#查询包含A不区分大写的人
print(teacher5)
#结果切片、排序、链式查询
print(Teacher.objects.all()[:1])
teacher6=Teacher.objects.all().order_by('-fans')for t in teacher6:print(t.fans)print(Teacher.objects.filter(fans__gte=500).order_by("nickname"))#链式查询就是对返回的查询集继续使用API
#查看执行的原生SQLprint(Teacher.objects.filter(fans__gte=500).order_by("nickname").query)"""
SELECT`orm_teacher`.`nickname`,`orm_teacher`.`introduction`,`orm_teacher`.`fans`,`orm_teacher`.`created_at`,`orm_teacher`.`updated_at`FROM`orm_teacher`WHERE`orm_teacher`.`fans`>=500ORDERBY`orm_teacher`.`nickname`ASC"""
返回新QuerySet的API:去重、排序、使用聚合计数、求和、平均数、反向查询等
#1.all(),filter(),order_dy(),exclude(),reverse(),distinct()去重
print(Student.objects.all().exclude(nickname='A同学'))#查询出所有的数据并去掉nickname=A同学的数据
s1=Student.objects.all().reverse() #使用reverse的话必须在模型类的元数据中添加ordering=['age']for s in s1:print(s.nickname,s.age)
#2.extra(),defer(),only()实现字段别名,排除一些字段,选择一些字段
s2=Student.objects.all().extra(select={'name':'nickname'}) #使用别名
for s in s2:print(s.name)print(Student.objects.all().only('nickname','age').query)
#3.values(),values_list()获取字段或者元祖形式的QuerySet
print(TeacherAssistant.objects.values('nickname','hobby')) #返回的是一个字典
print(TeacherAssistant.objects.values_list('nickname','hobby'))#返回的是一个元祖
print(TeacherAssistant.objects.values_list('nickname',flat=True))#当使用values_list只取一个字段的话可以使用一个参数flat=True这个用于将单个字段直接放到列表里面
#4.dates(),datetimes()根据时间日期获取查询集
print(Course.objects.dates('created_at','month',order='DESC'))#查询字段,按照什么排序,排序方式
#5.union(),intersection(),difference()并集、交集、差集
p_240=Course.objects.filter(price__gte=240) #查询课程信息表中价格大于等于240的信息
p_260=Course.objects.filter(price__lte=260) #查询课程信息表中价格小于等于240的信息
print(p_240.union(p_260))
#print(p_240.intersection(p_260))
#print(p_240.defference(p_260))
#6.select_related()一对一、多对一查询优化,prefetch_related()一对多、多对多查询优化;反向查询
"""通过课程查询讲师"""
courses=Course.objects.all().select_related('teacher')#指定外键字段这样可以减少查询次数增加效率
for c in courses:print(f"{c.title}--{c.teacher.nickname}--{c.teacher.fans}")"""通过学生查询课程"""
students=Student.objects.filter(age__lt=30).prefetch_related('course')for s in students:print(s.course.all())"""通过讲师查询课程"""
#使用反向查询需要在外键中添加一个参数related_name="xxxx"然后下面course_set替换成xxxx和下面效果一样
print(Teacher.objects.get(nickname="Jack").course_set.all())
#7.annotate()使用聚合计数、求和、平均数 raw()执行原生SQL
#from django.db.models import Count,Avg,Max,Min,Sum
"""讲师课程销量总和"""print(Course.objects.values('teacher').annotate(vol=Sum('volume')))print(Course.objects.values('teacher').annotate(vol=Avg('price')))