都是通过模型类进行数据的查询操作
学习⽬标
- 掌握 all()、get()、count()、filter()、exclude() 这些查询⽅法
- 熟练使⽤ ORM 条件查询的基本语法
- 熟练使⽤条件查询各种运算符
一、基本查询方法
- get 查询单⼀结果,模型类实例,如果不存在会抛出模型类 DoesNotExist 异常
- filter 过滤出多个结果,返回 QuerySet 类型对象
- exclude 排除掉符合条件剩下的结果,返回 QuerySet 类型对象
- all 查询多个结果,返回 QuerySet 类型对象
- count 查询结果数量
数据表是这个样子的:
1.1基本条件查询
需要引入的包:
from books.models import BookInfo
查询一个单一的结果
BookInfo.objects.get(commentcount=100)
由于get只能查询单一的结果,这里的commentcount结果有两个,所以就会报错 get() returned more than one BookInfo -- it returned 2!
get不行就换成filter 过滤,过滤就可以查询多个结果:
BookInfo.objects.filter(commentcount=100)
1.2 模糊条件查询
因为不知道查询结果是一条还是两条,还是多条,这里就使用filter
例:查询编号为2的图书
BookInfo.objects.filter(id__exact = 2)
例:查找书名包含“游”的图书
BookInfo.objects.filter(name__contains="游")
例: 查找书名以“梦”结尾的图书
BookInfo.objects.filter(name__endswith="梦")
例:查找书名为空的书籍
BookInfo.objects.filter(name__isnull=True)
查询这个空书籍信息的时候,需要在models.py修改添加一下:
def __str__(self):
return "" if isinstance(self.name,NoneType) else self.name
例:查询编号为 1,3的图书
BookInfo.objects.filter(id__in=[1,3])
例:查询编号不为 3的图书
BookInfo.objects.exclude(id__exact=3)
1.3 F 和 Q 对象
需要导入包 from django.db.models import F, Q
-
gt ⼤于 (greater then)
-
gte ⼤于等于 (greater then equal)
-
lt ⼩于 (less then)
-
lte ⼩于等于 (less then equal)
例:查询 阅读量 大于等于 评论量的书(表中的两列数据)
不能直接写列名进行比较,需要加F对象
BookInfo.objects.filter(readcount__gte=F("commentcount"))
例: 查询阅读量大于20,"或者"编号小于3的图书
Q对象可以进行两个条件的查询
BookInfo.objects.filter(Q(readcount__gt=400) | Q(id__lt=3))
1.4 聚合运算
例: 查询id大于2 的图书总量和总阅读量
需要导入的包: from django.db.models import QuerySet,Conut
先查询id大于2的所有图书
books:QuerySet = BookInfo.objects.filter(id__gt=2)
返回一个QuerySet类型,需要导入类型,才有aggregate提示
books.aggregate(Sum("readcount"),Count("id"))
输出结果:
{‘id__count’: 3}
{‘readcount__sum’: 80600}
例:查询阅读总数大于200的图书总数
BookInfo.objects.filter(readcount__gt=200).count()
排序
默认是从低到高排序
BookInfo.objects.all().order_by("readcount")
从高到低排序
BookInfo.objects.all().order_by("-readcount")
1.5关联查询,两个表的集合查询
导入model中的表from books.models import BookInfo, PeopleInfo
由一到多的查询
例:查询书籍id为4的所有人物信息
BookInfo.objects.get(id=4).peoples
#<django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager.<locals>.RelatedManager object at 0x000001937CD74668>
BookInfo.objects.get(id=4).peoples.all()
< QuerySet[ < PeopleInfo: 薛宝钗 >] >
但是需要在models.py里添加
def __str__(self):
return self.name
才能正常运行处结果
BookInfo.objects.get(id=4).peoples.all()
< QuerySet[ < PeopleInfo: 薛宝钗 >] >
由多到一的查询
例 :查询图书,要求图书人物为“武大郎”,当图书中只有一本书有武大郎
PeopleInfo.objects.get(name="武大郎").book
图书中不只有一本书有武大郎,
BookInfo.objects.filter(peoples__name="武大郎")
注意:related_name = “peoples”,因为在models自己设置了关联查询的名字
例:人物姓名中 包含 大”
BookInfo.objects.filter(peoples__name__icontains="大")
例:查询书名为“三国演义”的所有人物
PeopleInfo.objects.filter(book__name="三国演义")