QuerySet是Django的查询集,可以通过QuerySet条件查询得到对应模型的对象集合。
queryset 相当于sql 中的select语句
基本查询方法:all, filter, get, exclude.
- all() : 获取某张表的所有记录;
- filter(**kwargs) : 返回一个根据参数查询到的queryset;
- exclude(**kwargs): 和filter正好相反,返回除了根据参数查到的结果的其他值;
以上三种查询方法获得的结果,类型是一个结果集,相当于Python中列表,所以支持切片(不支持负数)、排序、获取长度等方法,
如all()[1:10],all().order_by(**kwargs),filter().len(),exclude().count()
- get(**kwargs): 返回一个根据参数查询到的唯一值,不再是列表类型。查询值不存在的话会报错DoesNotExist;
支持链式查询,如filter().filter().exclude().get(),
还可后接distinct(),表示去重;也可以接delete(),表示删除;update(),表示更新;explain(),表示执行该条语句所用时间
以上查询方法中的条件参数,可以用修饰符拓展,修饰符是两个下划线加修饰词。
Django的数据库API支持20多种查询类型,下面介绍一些常用的:
- excat: 默认类型,相当于不写
- iexact: 不区分大小写
- contains/icontains: 表示包含,后者不区分大小写
- startwith/istartwith: 自己猜
- endwith/iendwith: 再猜
- gt/gte: 大于/不小于
- lt/lte: 小于/不大于
- in: 后面跟一个列表,表示是否是列表中的一个元素
- year/month/date: 时间查询
- range: 范围查询
- F表达式,比较两个一个模型的两个字段。如filter(comment1__gt=F(comment2)),表示找出comment1大于comment2的对象。
- Q函数,表示逻辑或or。如Artical.objects.filter(Q(comment1__icontains='django')|Q(comment2__icontains='python')),相当于Artical.objects.filter(comment1__icontains='django')|Artical.objects.filter(comment1__icontains='python')
QuerySet有两个特性:惰性和自带缓存
惰性:单纯的定义queryset不会执行数据库操作,只有对它做进一步运算,例如打印、查询数量、是否存在等操作时才会执行。
自带缓存:当第一遍查询完结果后,会自动将结果缓存到queryset自带的cache中,第二次重新用此queryset将会直接使用此缓存结果,而不会再去操作数据库,减少与数据库的交互。