1. 常用查询
通过模型类上的管理器来构造QuerySet
- 模型类上的管理器是啥?
模型类.objects
- QuerySet 表示数据库中对象的集合
等同于select 语句, 不过其是惰性的
案例:
1. first() 获取第一条数据, 返回的是对象 # Students.objects.first()
2. last() 获取最后一条, 返回的也是对象 # Students.objects.last()
3. get(**kwargs) 根据给定的条件, 获取一个对象, 如果有多个对象符合 # Stu.objects.get(pk=1)
4. all() 获取所有记录, 返回的是queryset # Stu.objects.all()
5. filter(**kwargs) 根据给定的条件, 获取过滤后的queryset # Stu.objects.filter(name='long')
6. exclude(**kwargs) 跟filter的使用方法一致, 作用相反, 它是排除 # Stu.objects.exclude(name='long') 查询name != 'long' 的所有数据
7. values(*fields) 返回一个queryset, 返回一个字典列表, 而不是数据对象 # Stu.objects.all.values()
8. only(*fields) 返回queryset, 对象列表, 注意only一定包含主键字段
9. defer(*fields) 返回一个queryset, 作用与only相反
10. order_by(*fields) 根据给定的字段来排序, 默认是顺序, 字段名前加上`-`表示与默认排序相反的排序 Stu.objects.order_by('age') 正序 Stu.objects.order_by('-age')
11. 切片 和Python的列表切片用法相似(注: 不支持负索引,大数据量在时不用步长)
2. 常用条件查询 filter, exclude, get
1. exact Stu.objects.filter(name__exact='long') # 查询name='long' 的数据, 与 = 差不多
2. iexact
3. contains Stu.objects.filter(name__contains='long') # 查询name 中包含有'long'的数据区分大小写
4. icontains 不区分大小写
5. in Stu.objects.filter(age__in=[18, 20, 30]) # 查询age = 18 or 20 or 30 的数据
6. range 范围区间 Stu.objects.filter(age__range=(18, 20)) # 查询age 范围在18到20 的, 包含18和20
7. gt 大于 Stu.objects.filter(age__ge=18) 查询age>18的数据
gte 大于等于
lt
lte
8. startswith 找以什么开头的
9. istartswith # 不区分大小写的
10. endwith
11. iendwith
12. isnull # True False 对应sql中的: is null 和 is not null # Stu.objects.filter(age__isnull=False) # 查询age不为null的数据
3. 聚合分组 from.db.models import Count, Avg, Max, Min, Sum
通过queryset的aggregate()方法
# 1. 聚合
1. Count 统计数量
2. Avg 求平均值 `如: Student.objects.aggregate(age_avg=Avg('age')) # 计算平均年龄`
3. max
4. Min
5. Sum
# 2. 分组, 与聚合一起用
如: Student.objects.values('sex').annotate(Count('sex'))