
Django中的ORM之查:
1、对象查询
正向查找
1 2 3 4 5 | res1=Book.objects.first()
print (res1.title)
print (res1.price)
print (res1.publish)
print (res1.publisher.name)#因为一对多的关系,所以res1.publisher是一个对象,不是一个QuerySet集合
|
反向查找
1 2 3 4 | res2=Publish.objects.last()
print (res2.name)
print (res2.city)
print (res2.book_set.all())#res2.book_set是一个QuerySet集合,所以会打印集合中的所有对象元素
|
2、双下划綫(_)查询
双下划线(__)之单表条件查询
例子:
1 2 3 4 5 6 | table1.objects.filter(id__lt=10,id__gt=1)#获取id小于10,且大于1的记录
table1.objects.filter(id__in=[11,22,33,44])#获取id在[11,22,33,44]中的记录
table1.objects.exclude(id__in=[11,22,33,44])#获取id不在[11,22,33,44]中的记录
table1.objects.filter(name__contains= "content1" )#获取name中包含有 "contents" 的记录(区分大小写)
table1.objects.filter(name__icontains= "content1" )#获取name中包含有 "content1" 的记录(不区分大小写)
table1.objects.filter(id__range=[1,4])#获取id在1到4(不包含4)之间的的记录
|
可使用的条件:
1 2 3 4 | startswith# 指定开头的匹配条件
istartswith# 指定开头的匹配条件(忽略大小写)
endswith# 指定结束的匹配条件
iendswith# 指定结束的匹配条件(忽略大小写)
|
双下划线(__)之多表条件查询
正向查找(条件)之一对一查询
1 2 | #查询书名为 "python" 的书的id号res3=Book.objects.filter(title= "python" ).values( "id" )
print (res3)
|
正向查找(条件)之一对多查询
1 2 3 4 | #查询书名为 "python" 的书对应的出版社的地址res4=Book.objects.filter(title= "python" ).values( "publisher__city" )
print (res4)#查询 "aaa" 作者所写的所有的书的名字res5=Book.objects.filter(author__name= "aaa" ).values( "title" )
print (res5)#查询 "aaa" 作者所写的所有的书的名字(与上面的用法没区别)res6=Book.objects.filter(author__name= "aaa" ).values( "title" )
print (res6)
|
反向查找之一对多查询
1 2 3 4 5 6 | #查询出版了书名为 "python" 这本书的出版社的名字
res7=Publisher.objects.filter(book__title= "python" ).values( "name" )
print (res7)
#查询写了书名为 "python" 的作者的名字
res8=Publisher.objects.filter(book__title= "python" ).values( "book__authors" )
print (res8)
|
反向查找之多对多查询
1 2 3 | #查询所写的书名为 "python" 的作者的名字
res9=Author.objects.filter(bool__title= "python" ).values( "name" )
print (res9)
|
条件查询即与对象查询对应,是指filter,values等方法中的通过__来明确查询条件
3、聚合查询和分组查询
aggregate(*args,**kwargs)
通过到QuerySet进行计算,返回一个聚合值的字典,aggregate()中的每一个参数都指定一个包含在字典中的返回值,即在查询集合中生成聚合
例子:
1 2 3 | from django.db.models import Avg,Max,Min,Sum#计算所有书籍的平均价格,书籍最高的价格和最低价格
res1=Book.objects.all().aggregate(Avg( "price" ),Max( "price" ),Min( "price" ))
print (res1)#打印为 "{'price__avg':xxx,'price__max':xxx,'price__min':xxx}"
|
Django的查询语句提供了一种方式描述所有图书的集合
1 2 3 4 | aggregate()子句的参数可以指定想要计算的聚合值.
aggregate()是QuerySet的一个终止子句,返回一个包含一些键值对的字典.
字典的键的名称是聚合值的标识符,是按照字段和聚合函数的名称自动生成出来的.
字典的值是计算出来的聚合值.
|
可以为聚合值指定一个名称.
1 2 3 | #计算所有书籍的平均价格,并给书籍的平均价格起一个别名
res2=Book.objects.all().aggregate(average__price=Avg( "price" ))
print (res2)#打印为 "{'average_price':xxx}"
|
annotate(*args,**kwargs)
可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合
1 2 3 4 5 6 | #查询作者 "aaa" 所写的所有的书的名字
res3=Book.objects.filter(authors__name= "aaa" ).values( "title" )
print (res3)
#查询作者 "bbb" 所写的所有的书的总价格
res4=Book.objects.filter(authors__name= "bbb" ).aggregate(Sum( "price" ))
print (res4)
|
查询各个作者所写的书的总价格,就要使用分组
1 2 3 4 5 6 | #查询每个作者所写的所有书籍的总价格
res5=Book.objects.values( "authors__name" ).annotate(Sum( "price" ))
print (res5)
#查询各个出版社所出版的书籍的总价格
res6=Book.objects.values( "Publish__name" ).annotate(Min( "price" ))
print (res6)
|
4、F查询和Q查询
F查询专门取对象中某列值的操作
1 2 3 4 | #导入F
from django.db.models import F
#把table1表中的num列中的每一个值在的基础上加10
table1.objects.all().update(num=F( "num" )+10)
|
Q构建搜索条件
1 2 | #导入Q
from django.db.models import Q
|
Q对象可以对关键字参数进行封装,从而更好的应用多个查询#查询table2表中以"aaa"开头的所有的title列
1 | q1=table2.objects.filter(Q(title__startswith= "aaa" )).all() print (q1)
|
Q对象可以组合使用&,|操作符,当一个操作符是用于两个Q对象时,会产生一个新的Q对象
1 2 | #查找以 "aaa" 开头,或者以 "bbb" 结尾的所有title
Q(title__startswith= "aaa" ) | Q(title__endswith= "bbb" )
|
Q对象可以用"~"操作符放在表达式前面表示否定,也可允许否定与不否定形式的组合
1 2 | #查找以 "aaa" 开头,且不以 "bbb" 结尾的所有title
Q(title__startswith= "aaa" ) & ~Q(title__endswith= "bbb" )
|
Q对象可以与关键字参数查询一起使用,Q对象放在关键字查询参数的前面
查询条件:
1 2 | #查找以 "aaa" 开头,以 "bbb" 结尾的title且书的id号大于4的记录
Q(title__startswith= "aaa" ) | Q(title__endswith= "bbb" ),book_id__gt=4
|
更多Python知识,请关注:Python自学网!!