件
* id__lt=3 表示id小于3
* id__gt=1 表示id大于1
* id__in=[1, 2, 3] 表示id在列表中
* name__contains="fenc" 表示name中包含fenc
* name__icontains="ven" 表示不区分大小写的包含
* id__range=[1,3] 表示id在1到3之间,包括1,3
* name__startswith='cs' 表示以cs开头的
* name__endswith='cs' 表示以cs结尾的
* name__istartswith 不区分大小写
* name__iendswith 不区分大小写
* 等等
######5.聚合查询aggregate
聚合查询是对QuerySet对象进行计算得到一个结果值作为字典中的值放到一个字典中
这里先引入一些聚合方法
```python
from django.db.models import Avg,Min,Sum,Max
```
举例:
```python
result=student.objects.all().aggregate(Max('num'))
print(result)
```
得到的是一个字典:{'num__max': 3}
若你想给这个字典的key换一个名字,可以使用:
```python
result=student.objects.all().aggregate(new_name=Max('num'))
```
输出:{'new_name': 3}
也可以同时进行多个聚合查询
```python
result=student.objects.all().aggregate(Avg('num'),Min('num'),new_name=Max('num'))
```
######6.分组查询annotate
分组查询就像是SQL语句中的group by
可以如下使用,即以school_id分组,计算每组的max(num)
```python
result=student.objects.values('school_id').annotate(Max('num'))
```
也可以对QuerySet对象使用
在查询得出的结果集中进行分组
```python
result=student.objects.filter(school_id__lt=2).values('school_id').annotate(Max('num'))
```
######7.F查询
执行F查询前还得先引入
```python
from django.db.models import F
```
F查询可以将对象中的值作为变量使用,例如:
```python
result=student.objects.filter(id__gt=F('school_id'))
```
或者
```python
result=student.objects.update(num=F('school_id')+1)
```
######8.Q查询
惯例先引入
```python
from django.db.models import Q
```
Q查询是应用在查询条件上的。
在普通的查询当中,且可以用逗号‘,’表示,可是如果我们想使用或的关系怎么办,使用Q来完成它
```python
student1=student.objects.filter(Q(num=1) | Q(school_id=1))
```
相当于用Q将条件封装,在Q对象之间使用&或者|或者~
如果想将普通发关键字参数查询与Q查询一起使用,必须将关键字参数查询放到Q的后边
######9.扩展查询extra
Django 的查询语法难以简练地表达复杂的 WHERE 子句,于是使用扩展查询extra,其原理相当于给SQL语句中添加子语句
extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
这些参数都是可写可不写的
简单举例:
直接暴力上中文了
```python
student1=student.objects.extra(select={'是否大于2':'num>2'})
print(student1.values('是否大于2')[0]['是否大于2'])
```
SQL语句其实执行的是SELECT (num>2) AS `是否大于2` FROM `blog_student
可以为select传递参数
```python
student1=student.objects.extra(select=({'是否大于2':'num>%s'}),select_params = ('2',))
```
可以排序
加‘-’为从大到小,不加为从小到大
```python
student1=student.objects.extra(select=({'是否大于2':'num>%s'}),select_params = ('2',))
student1=student1.extra(order_by=['-是否大于2'])
```
语句中会添加SELECT (num>'2') AS `是否大于2` FROM `blog_student` ORDER BY `是否大于2` DESC
也可以设置where条件,并且给where设置参数
```python
student1=student.objects.extra(select=({'是否大于2':'num>%s'}),select_params = ('2',),where=['id<%s'],params=['4'])
```
SQL语句为SELECT (num>'2') AS `是否大于2` FROM `blog_student` WHERE (id<'4') ORDER BY `是否大于2` DESC
######10.日志查看对应执行的SQL语句
在setting.py中加上下边的代码
```python
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
LOGGING
```