这节未来回头多看看。讲了各种sql语句的orm写法。和Join查询的写法。
提到个叫prefetch的东西。回头研究下文档
queryset我的理解就是SQL returned result的python里对应的一个表现类。
obj.filter.select_realted('字段名')
一对一优化
obj.filter.prefetch_related('字段名')
多对多优化
MySQL 只支持并集查询
obj.values 元组含对象名称
obj.values_list 只含内容
obj.values_list flat=true (单个)
反向排序 ,需要在Meta 中设置ordering = ['字段名']
Student.object.all().exclude(nickname='A') :不包括
Student.object.all().reverse()对结果集反向排序:需要在Meta中先ordering
Student.object.all().distinct():对结果集去重
Student.object.all().extra(select={"name": "nickname"}) 对结果集中的nickname字段起一个name的别名
Student.object.all().only('nickname', 'age') 对结果集中的字段做选择,只显示选择的字段
Student.object.all().defer('nickname') 和only相反,排除一些字段
Student.object.values('nickname', 'hobby') 返回结果是QuerySet的列表嵌套一个个字典
Student.object.values_list('nickname', hobby')返回结果是QuerySet的列表嵌套一个个组
Student.object.values_list('nickname', flag=True) 当values_list只有一个字段时使用flag=True,可以将返回的结果QuerySet直接放在列表里,没有嵌套
Course.objects.dates('created_at', 'month', order='DESC') 返回以字段created_at的月份(去重后)降序的结果集(year, month, day)
Course.objects.datetimes('created_at', 'munite', order='DESC') 返回以字段created_at的分钟(去重后)降序的结果集(year, month, day, hour, munite, second)
union()并集 intersection()交集 difference()差集
p1 = Course.objects.filter(price__gte=240)
p2 = Course.objects.filter(price__lte=240)
p1.union(p2)
p1.intersection(p2)
p1.difference(p2)
通过子表查父表(外键都设置在子表中)
select_related() 一对一,多对一查询优化(查询子表的时候一次将父表的信息也查出来)
courses = Course.objects.all().select_related('teacher') 原生的SQL语句会变的很少
for c in courses:
print(f"{c.title}--{c.teacher.nickname}")
prefetch_related() 一对多,多对多查询优化
students = Students.objects.filter(age__lt=30).prefetch_related('course')
for s in students:
print(s.course.all())
通过父表查子表(外键都设置在子表中):反向查询
Teacher.objects.get(nickname='Jack').course_set.all() 通过父表Teacher查Course,需要小写类名_set获取子表的信息
如果子表的外键中设置有属性related_name='relate' 可以使用下面的方法替代course_set
Teacher.objects.get(nickname='Jack').relate.all()
annotate() 使用聚合计数,Count, Sum, Avg, Max, Min
annotate(vol=Sum('valume')) annotate(别名=Sum('字段名'))
Course.objects.values('teacher').annotate(vol=Sum('valume'))
Course.objects.values('teacher').annotate(pri=Sum('price'))
objects.values('xxx') 根据xxx进行分组
聚合计算
objects.values('xxx').annotate(自定义键值=“map类”函数(某个字段)
反向查询 小写的类名称+_set。
或者外键有个属性,可以取别名。
这里注意存在一对多和多对多的时候,查询时的优化技巧。
select_related 指定 外键 (一对多)
prefetch_related 指定 外键 (多对多)
返回新的queryset得api:
exclude()根据条件排除一些记录Student.objects.all().exclude(name='a')
reverse()反向排序必须在模型类对应的元数据设置排序Student.objects.all().exclude(name='a').reverse()
distinct()去重
extra()实现字段别名
defer()排除一些字段
only()选择一些字段
valus(),valus_list()获取字典或元组形式得queryset
datas(),datatimes()根据时间日期获取查询集
union(),intersection(),difference()并集,交集,差集
select_relate()一对一多对一查询优化
prefetch_related()一对多,多对多查询优化;反向查询
annotate()使用聚合函数、求和、平均数 raw ()执行原生sql
course.objects,values('teacher').annotatea(avg = Avg'字段名')
select_related和prefetch_related保证在查询对象集合的时候,把指定的外键对象也一并完整查询加载,避免后续的重复查询
select_related适用于外键和多对一的关系查询
prefetch_related适用于一对多或者多对多的查询