- 9.6 数据库查询(重点)
-
ORM 的两种查询方式
-
原生 sql 的查询方法
User.object.raw(‘select * from user where id=1’)
-
基于 ORM 方法查询
Usertest.objects.filter(id=1)
-
-
基于 ORM 的常用查询方法
| 方法名 | 描述 |
|---|---|
| User.objects.all() | 返回 user 表中的所有数据 |
| User.objects.get(**filter) | 返回满足条件的数据(单条,没有数据则抛出异常) |
| User.objects.filter(**filter) | 返回满足条件的数据(多条, 没有数据则返回空数据) |
| User.objects.all()/filter().exists() | 返回是否有对象 True False |
| User.objects.all()/filter().count() | 返回获取到对象的数量 |
| User.objects.all()/filter().exclude(**filter) | **返回的数据库中排除满足 filter 的 |
| User.objects.filter().distinct(‘age’) | 返回的对象中通过某个列去重 |
| User.objects.filter().order_by(‘age’) | 返回对象中通过 age 排序 |
| dir(User.objects) | 查询其他方法 |
- 深入查询
| 属性名 | 描述 | 举例 |
|---|---|---|
| __exact | 类似于 sql 中的 like 精确查找 | name__exact=‘小钟’ |
| __iexact | 精确查找且忽略大小写 | name__iexact=‘小钟AbC’ |
| __contains | 类似于 ‘like %小钟% ’ 模糊查找 | name__contains=‘小钟’ |
| __icontains | 模糊查找且忽略大小写 | name__icontains=‘小钟’ |
| __gt | 大于 | age__gt=18 |
| __gte | 大于等于 | age__gte=18 |
| __lt | 小于 | age__lt=18 |
| __lte | 小于等于 | age__lte=18 |
| __isnull | 是否为空 | name__isnull=True |
| __startswith | 以什么开头 | name__startswith=‘小’ |
| __istartswith | 以什么开头且忽略大小写 | name__istartswith=‘小AbC’ |
| __endswith | 以什么结尾 | name__endswith=‘钟’ |
| __iendswitch | 以什么结尾且忽略大小写 | name__iendswith=“bC钟” |
| __in | 查询在标准的那个数据 | name__in=[‘小钟’, ‘小红’] |
- 或查询
from django.db import Q # 查询满足条件其一的数据 类似于 where username='小钟' or username='小红' user = User.object.filter(Q(username='小钟') | Q(username='小红'))
- 聚合查询(aggregate)
| 方法名 | 描述 | 举例 |
|---|---|---|
| Avg | 平均值 | User.object.all().aggregate(Avg=‘age’) |
| Sum | 取和 | User.object.all().aggregate(Sum=‘age’) |
| Max | 最大值 | User.object.all().aggregate(Max=‘age’) |
| Min | 最小值 | User.object.all().aggregate(Min=‘age’) |
| Count | 计数 | User.object.all().aggregate(Count=‘age’) |
- 多表查询之反向查询
当在 user 表中和 diary 表之间有所关联的时候,通过 user 模型借助 diary 关联的条件进行查找 user 的时候,我们称之为反向查询 查找在 diary 表中 id 为 2 的这个对应的 user user = useryobjects.filter(diary__id=2)
- 多表查询值查询关联信息
通过主对象选择需要查找的表对应的 related_name ,通过 value 查询具体信息
user = user.objects.get(pk=1)
user.diary.values('content ') # 返回 id 为1的用户的 diary 的 content 信息
user.diary.count() # 返回id为1的用户的diary关联数量
补充: user.diary 其实就是 Diary 模型,我们可以通过它再去调用更多方法,比如 get filter 再去扩展查询



