例如我们要查询数据库中一张表(bookinfo)的所有数据,sql语句为:select * from bookinfo,
对应模型类的操作是: BookInfo.objects.all()
cd到当前django项目的目录下,进入携带django环境的python解释器进行测试操作:
$ python manage.py shell
$ from book_app.models import *
即可进行模型对象的语句语句操作,执行以下语句看看我们查询的到底是什么东西
$ type(BookInfo.objects) -->
$ type(BookInfo.objects.all()) -->
$ type(BookInfo.objects.all()[0]) -->
也就是说,objects是一个模块对象管理器,objects.all是一个查询集QuerySet,
取查询集的第一个元素QuerySet[0],可以看到查询集里面存的元素就是符合条件的我们设计表时所创建类BookInfo的实例对象
QuerySet查询集支持小标和切片,切片返回的是一个新的查询集
all() --> 返回所有数据
filter([条件]) --> 返回满足条件的所有数据
exclude([条件]) --> 返回满足条件外的所有数据
order_by([条件]) --> 根据条件排序,并返回 (可以用'-'实现倒序)
get([条件]) --> 返回满足条件的单个数据;如果未找到将抛出异常:DoesNotExist;如果找到的是多条将抛出异常:MultipleObjectsReturned
count() --> 返回查询结果总数
aggregate() --> 聚合,返回一个字典 (聚合函数:Avg、Max、Min、Sum、Count,例: objects.aggregate(Sum("name")))
exists() --> 判断查询集中是否有数据,有为True
values([属性名]) --> 返回一个列表,以字典形式存放所有对象的属性值
values_list([属性名]) --> 返回一个列表,以列表形式存放所有对象的属性值
等于:属性=值 大于:属性__gt=值 大于等于:属性__gte=值
小于:属性__lt=值 小于等于:属性__lte=值 范围:属性_in=值(值应为可选项的列表,例: id_in=[1,3,5],指定id=1、3、5的3个数据)
属性__isnull=True/False
指定开头:属性__startwith=值 指定结尾:属性__endwith=值
指定日期(属性值应为日期相应类型):属性_year=值 属性_month=值(例:birthday_month=11,指定birthday的月份为11月的数据)
F对象:不知道某个属性的值,也可以用它来进行比较,例: filter(read_gt=F('comment')*2), 查询阅读数量大于评论数量2倍的数据
Q对象:实现逻辑与、非的查询
与: objects.filter(read_gt=20).filter(comment_gt=20) 阅读和评论数都大于20
或: objects.filter(Q(read_gt=20 | comment_gt=20)) 阅读数大于20或评论数大于20
非: objects.filter(-Q(read_gt=20)) 阅读数不大于20
懒惰:创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用等
缓存:使用同一个查询集,第一次使用时会发生数据库的查询,然后把结果缓存下来,再次使用这个查询集时会使用缓存的数据。