链式调用:
在视图函数中,比如调用 模型.objects.filter 这个filter方法实际上拷贝的是QuerySet类中的方法,从数据库取值时,返回的类型也是一个QuerySet类型,所以我们可以链式调用:
# 过滤出id大于等于1且id小于等于3的数据
article = Artilce.objects.filter(id__gte=1).filter(id__lte=3)
集合查询:
过滤器:返回查询集的方法叫做过滤器
之所以叫查询集,因为使用下列方法,返回的就是一个查询集,其实就是一个特殊的list而已
# 查询集
<QuerySet [xxx, xxx]>
#查询集的type
<class 'django.db.models.query.QuerySet'>
1、all( ) 全部查询,配合切片实现限制查询
User.objects.all()[10:20] # 左闭右开
2、filter( ) 过滤,返回满足条件的
User.objects.filter(name='吕星辰') # 返回name为'吕星辰'的集合,等号左边为数据库的字段名
3、exclude( ) 排除,排除满足条件的
User.objects.exclude(pk=1) # 过滤掉主键为1的字段(除了主键为1的字段其它全查出来)
4、order_by( ) 以某种规则排序
5、values( ) 返回一个对象字典的列表,像json一样,但是还是一个查询集!
5.1 、可以使用list() 函数转为列表类型。。。
User.objects.all().values()
#<QuerySet [{'id': 1, 'k': 'v', 'k': 'v'},··· ···]>
5.2 、也可以在values中指定参数查询指定的字段:
单值查询:
单值查询:就是返回的一个值,而不是一个集合,这是我为它起的名字,便于理解。
1、get()仅返回单个满足条件的对象,如果未能查到则抛出DoesNotExist异常
User.objects.get(pk=1)
2、count()返回当前查询的总数
User.objects.filter(pk__gt=1).count()
3、first()返回第一个对象,如果没有返回None
4、last()返回最后一个对象,如果没有返回None
5、exist()判断查询集是否有数据,有返回True
字段查询表达式:
所为的字段查询表达式,就是为查询设置条件,字段查询表达式<<只>>可以作为filter()、exclude()、get()的参数,实现where子句。
格式如下:
name为要查询的字段;然后便便需要加俩下划线,紧接着查询条件,等号后边为值( 所以数据库字段名禁止命名有俩下划线 __的任何名字!)
filter(name__查询的条件='查询的值')
1、exact()严格等于,其实在上边所有的查询都是以下写法的简写!
User.objects.filter(name__exact='lxc') # 等于 User.objects.filter(name='lxc')
2、contains是否包含,大小写敏感!
qs = User.objects.all(title__contains='天')
#把title中包含 '天' 的字段全部查出来
3、startswith、endswith 以什么开头或结尾的,大小写敏感
User.objects.filter(username__startswith='星')
4、是否为 null、isnull、isnotnull
5、iexact、icontains、istartswith、iendswith ( i 的意思是忽略大小写 )
6、in 是否在指定的范围中
不管有多少个符合条件的,它只返回第一个符合条件的字段,没有则返回一个空的查询集
User.objects.filter(pk__in=[2,3,4,100,600]) # 这里边2、3、4都符合条件,但是它只返回 主键为2的字段
7、gt、gte 大于、大于等于 (对应的英文单词为:greater than、equal )
lt、lte 小于、小于等于 (对应的英文单词为:less than、equal)
filter(pk__gt=3) # 返回主键大于3的
filter(pk__lt=3) # 返回主键小于3的
8、year 年、month 月、week_day 周几、hour 小时、minute 分、second 秒
filter(title__year=2019) # 把取出title是2019的字段给取出来
Q对象
虽然Django提供传入条件的方式,但是不方便,Q对象是用来做条件的 与 、或、 非
它可以使用 & (与) |(或) ~(非)来构造复杂的逻辑表达式
首先,引入Q对象
from django.db.models import Q
比如:
User.objects.filter(Q(pk__gt=5) & Q(pk__lt=10)) # 与 —— 大于5 小于10
User.objects.filter(Q(name='星辰') | Q(name='小西')) # 或
User.object.filter(~Q(name='星辰')) # 非