python 暑期实训 第十五天-----------ORM:mysql数据的查询操作

都是通过模型类进行数据的查询操作
学习⽬标

  • 掌握 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="三国演义")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你在狗叫什么、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值