一、前言:
Django查询数据库中的信息,实质是将SQL语句封装成了其内置的方法。打开mysql日志文件可以看到django每次执行查询命令时对应的sql语句。
查看mysql日志的方法:
1.修改mysql配置文件,去除68,69行的注释。文件路径(/etc/mysql/mysql.conf.d/mysqld.cnf):
2.重启mysql服务:
sudo service mysql restart
3.查看mysql日志文件,文件路径(/var/log/mysql/mysql.log):
sudo tail -f /var/log/mysql/mysql.log
二、查询命令详细:
2.1 查询函数:
通过模型类.objects属性可以调用如下函数,实现对模型类对应的数据表的查询。
函数名
功能
返回值
说明
get
返回表中满足条件的一条且只能有一条数据。
返回值是一个模型类对象。
参数中写查询条件。
如果查到多条数据,则抛异常MultipleObjectsReturned。
2)查询不到数据,则抛异常:DoesNotExist。
all
返回模型类对应表格中的所有数据。
返回值是QuerySet类型
查询集
filter
返回满足条件的数据。
返回值是QuerySet类型
参数写查询条件。
exclude
返回不满足条件的数据。
返回值是QuerySet类型
参数写查询条件。
order_by
对查询结果进行排序。
返回值是QuerySet类型
参数中写根据哪些字段进行排序。
get示例:
例:查询图书id为3的图书信息。
BookInfo.objects.get(id=3)
all方法示例:
例:查询图书所有信息。
BookInfo.objects.all()
filter方法示例:
条件格式:
模型类属性名__条件名=值
查询图书评论量为34的图书的信息:
BookInfo.objects.filter(bcomment=34)
a)判等 条件名:exact。
例:查询编号为1的图书。
BookInfo.objects.get(id=1)
b)模糊查询
例:查询书名包含'传'的图书。contains
BookInfo.objects.filter(btitle__contains='传')
例:查询书名以'部'结尾的图书 endswith 开头:startswith
BookInfo.objects.filter(btitle__endswith='部')
c)空查询 isnull
例:查询书名不为空的图书。isnull
# select * from booktest_bookinfo where btitle is not null;
BookInfo.objects.filter(btitle__isnull=False)
d)范围查询in
例:查询id为1或3或5的图书。
# select * from booktest_bookinfo where id in (1,3,5);
BookInfo.objects.filter(id__in= [1,3,5])
e)比较查询 gt(greate than):大于 lt(less than):小于 gte(equal) :大于等于 lte:小于等于
例:查询id大于3的图书。
# Select * from booktest_bookinfo where id>3;
BookInfo.objects.filter(id__gt=3)
f)日期查询
例:查询1980年发表的图书。
BookInfo.objects.filter(bpub_date__year=1980)
例:查询1980年1月1日后发表的图书。
from datetimeimport date
BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))
exclude方法示例:
例:查询id不为3的图书信息。
BookInfo.objects.exclude(id=3)
order_by方法示例:
作用:进行查询结果进行排序。
例:查询所有图书的信息,按照id从小到大进行排序。
BookInfo.objects.all().order_by('id')
例:查询所有图书的信息,按照id从大到小进行排序。
BookInfo.objects.all().order_by('-id')
例:把id大于3的图书信息按阅读量从大到小排序显示。
BookInfo.objects.filter(id__gt=3).order_by('-bread')
2.2F对象 —— 类属性比较
作用:用于类属性之间的比较。
使用之前需要先导入:
from django.db.models import F
例:查询图书阅读量大于评论量图书信息。
BookInfo.objects.filter(bread__gt=F('bcomment'))
例:查询图书阅读量大于2倍评论量图书信息。
BookInfo.objects.filter(bread__gt=F('bcomment')*2)
2.3Q对象 —— 逻辑关系
作用:用于查询时条件之间的逻辑关系。not and or,可以对Q对象进行&|~操作。
使用之前需要先导入:
from django.db.models import Q
例:查询id大于3且阅读量大于30的图书的信息。
BookInfo.objects.filter(id__gt=3, bread__gt=30)
BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30))
例:查询id大于3或者阅读量大于30的图书的信息。
BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))
例:查询id不等于3图书的信息。
BookInfo.objects.filter(~Q(id=3))
2.4 聚合函数
作用:对查询结果进行聚合操作。
sum count avg max min
aggregate:调用这个函数来使用聚合。 返回值是一个字典
使用前需先导入聚合类:
from django.db.models import Sum,Count,Max,Min,Avg
例:查询所有图书的数目。
BookInfo.objects.all().aggregate(Count('id'))
# {'id__count': 5}
例:查询所有图书阅读量的总和。
BookInfo.objects.aggregate(Sum('bread'))
# {'bread__sum': 126}
count函数 返回值是一个数字
作用:统计满足条件数据的数目。
例:统计所有图书的数目。
BookInfo.objects.all().count()
BookInfo.objects.count()
例:统计id大于3的所有图书的数目。
BookInfo.objects.filter(id__gt=3).count()
小结:
参考文档:
三、查询集
3.1 查询集特征:
惰性查询:只有在实际使用查询集中的数据的时候才会发生对数据库的真正查询。
缓存:当使用的是同一个查询集时,第一次使用的时候会发生实际数据库的查询,然后把结果缓存起来,之后再使用这个查询集时,使用的是缓存中的结果。
3.2 限制查询集
可以对一个查询集进行取下标或者切片操作来限制查询集的结果。
对一个查询集进行切片操作会产生一个新的查询集,下标不允许为负数。
取出查询集第一条数据的两种方式:
方式
说明
b[0]
如果b[0]不存在,会抛出IndexError异常
b[0:1].get()
如果b[0:1].get()不存在,会抛出DoesNotExist异常。
exists:判断一个查询集中是否有数据(True False)。
四、关联查询(一对多的情况)
4.1 查询和对象关联的数据
在一对多关系中,一对应的类我们把它叫做一类,多对应的那个类我们把它叫做多类,我们把多类中定义的建立关联的类属性叫做关联属性。
例:查询id为1的图书关联的英雄的信息。
b=BookInfo.objects.get(id=1)
b.heroinfo_set.all()
通过模型类查询:
HeroInfo.objects.filter(hbook__id=1)
例:查询id为1的英雄关联的图书信息。
h = HeroInfo.objects.get(id=1)
h.hbook
通过模型类查询:
BookInfo.objects.filter(heroinfo__id=1)
格式:
由一类的对象查询多类的时候:
一类的对象.多类名小写_set.all() #查询所用数据
由多类的对象查询一类的时候:
多类的对象.关联属性 #查询多类的对象对应的一类的对象
由多类的对象查询一类对象的id时候:
多类的对象. 关联属性_id
4.2 通过模型类实现关联查询
例:查询图书信息,要求图书关联的英雄的描述包含'八'。
BookInfo.objects.filter(heroinfo__hcomment__contains='八')
例:查询图书信息,要求图书中的英雄的id大于3.
BookInfo.objects.filter(heroinfo__id__gt=3)
例:查询书名为“天龙八部”的所有英雄。
HeroInfo.objects.filter(hbook__btitle='天龙八部')
通过多类的条件查询一类的数据:
一类名.objects.filter(多类名小写__多类属性名__条件名)
通过一类的条件查询多类的数据:
多类名.objects.filter(关联属性__一类属性名__条件名)
4.3 自关联
自关联是一种特殊的一对多的关系。
案例:显示广州市的上级地区和下级地区。
地区表:id, atitle, aParent;
# 广州市:
area= Areainfo.object.get(title='广州市')
# 上级地区:
parent=area.aParent()
# 下级地区:
children= area.areainfo_set.all()