1.orm模型的使用
1.在ORM模型中contains和icontains都是查找目标中包含老师字符串的,唯一的区别是icontains对大小写不敏感,而contains对大小写是敏感的
Teacher.objects.filter(name__contains='老师') Teacher.objects.filter(name__icontains='老师')
2.在ORM模型中exact和iexact绝大多数情况下是相等的:
(1)exact在底层会被翻译成=
(2)iexact在底层会被翻译成like
Teacher.objects.filter(name__exact='老师1') Teacher.objects.filter(name__iexact='老师1')
3.在ORM模型中id__in=用于查询多个符合条件的结果,返回一个queryset类型
Student.objects.filter(name__in=['学生1','学生2','学生100'])
4.在ORM也可以关联查询,例如:想查找“学生1”科目的所有成绩,首先是要查询成绩所以要以分数表来当做目标开始查询
Score.objects.filter(student__name='学生1')
#如果只想要查询学生1的python课程的成绩可以使用:Score.objects.filter(student__name='学生1', course__name='python')
5.比较查询条件:
gt:大于
gte:大于等于
lt:小于
lte:小于等于
6.startswith和istartwith判断某个字段的值是否是以某个值开始的。前面大小写敏感。后面大小写不敏感。示例代码如下:
articles = Article.objects.filter(title__startswith='hello')
'''
以上代码的意思是提取所有标题以hello
字符串开头的文章。
将翻译成以下SQL
语句:
'''
select ... where title like 'hello%'
7.endswith和iendswith用法同上,判断用以什么字母结尾endswith大小写敏感,iendswith大小写不敏感
用法同上
8.range是区间查找,以下代码表示查找id在2和4之间的数据,类似sql语句的between...and...
Student.objects.filter(id__range=[2,4])
9.regex和iregex为正则表达式查询,前者都大小写敏感,后者大小写不敏感
Article.objects.filter(title__regex=r'^hello') ''' 以上代码的意思是提取所有标题以hello字符串开头的文章。 将翻译成以下的SQL语句: ''' select ... where title regexp binary '^hello';
2.聚合函数
1.Avg函数,求平均值,需要以下命令导入,返回来的是一个字典
from django.db.models import Avg #查询所有学生的平均成绩可以用以下代码: avg_score = Score.objects.aggregate(Avg('number')) print(avg_score) #要查询某个同学的平均成绩可以用以下代码: s = Score.objects.filter(student__name='学生1') res = s.aggregate(Avg('number')) #要查询全班学生的平均成绩: s = Score.objects.all() res = s.aggregate(avg=Avg('number'))#返回字典的key就是avg
2.Count函数,求个数,需要以下命令导入,返回来的是一个字典
from django.db.models import Count #求student这个表里有多少个学生 num = Student.objects.aggregate(Count('id')) print(num)
3.Max
和Min
:获取指定对象的最大值和最小值。比如想要获取Author
表中,最大的年龄和最小的年龄分别是多少。那么可以通过以下代码来实现:
from django.db.models import Max,Min result = Author.objects.aggregate(Max('age'),Min('age'))
4.Sum
:求指定对象的总和。比如要求图书的销售总额。那么可以使用以下代码实现:
from djang.db.models import Sum result = Book.objects.annotate(total=Sum("bookstore__price")).values("name","total")
5.aggregate和annotate的区别:
-
-
aggregate
:返回使用聚合函数后的字段和值。 -
annotate
:在原来模型字段的基础之上添加一个使用了聚合函数的字段,并且在使用聚合函数的时候,会使用当前这个模型的主键进行分组(group by)。
比如以上Sum
的例子,如果使用的是annotate
,那么将在每条图书的数据上都添加一个字段叫做total
,计算这本书的销售总额。
而如果使用的是aggregate
,那么将求所有图书的销售总额。
-