django ORM模型

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.MaxMin:获取指定对象的最大值和最小值。比如想要获取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的区别:

    1. aggregate:返回使用聚合函数后的字段和值。

    2. annotate:在原来模型字段的基础之上添加一个使用了聚合函数的字段,并且在使用聚合函数的时候,会使用当前这个模型的主键进行分组(group by)。
      比如以上Sum的例子,如果使用的是annotate,那么将在每条图书的数据上都添加一个字段叫做total,计算这本书的销售总额。
      而如果使用的是aggregate,那么将求所有图书的销售总额。

原文地址:https://www.cnblogs.com/fengzi7314/p/10393261.html