Django之QuerySet浅谈

祝你情人节快乐 一切安好

文章目录

片刻小叙
1.ORM
2.什么是QuerySet
3.QuerySet常用的查询函数
4.复杂查询

片刻小叙

自学django也有半月 跟着书或看看视频 也能敲点东西出来

闲来无事 也想写点东西证明我学过 忘了看看也能时时想起

一点个人笔记 也希望对你有点帮助 那样的话我也算是功德无量了

django 官方文档这样说

DjangoThe web framework for perfectionists with deadlines.
      web完美主义者框架

美丽算不上 但着实方便 python确实是站在巨人的肩膀上

我们这些代码的巧匠 也需要不断为之努力
让行行代码成诗句 成为键盘上的手尖舞者

闲话留在评论 我们进入正题

参考文献《Django企业开发实战》及不知名视频资料

1.ORM

在了解QuerySet之前让我们简单理解理解一下ORM
Object-- Relational-- Mapping
 对象  映射   关系 
 
如图所示
在这里插入图片描述
简单来说就是 django建立模型 定义了模型的相关属性 django进行数据迁移时,Django会把Model对应到数据库的表上,自动帮我们生成数据表

ORM 主要实现程序对象到关系数据库数据的映射 ,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了。

扫描二维码关注公众号,回复: 9347923 查看本文章


Model中定义一个属性:

				 from django.db import models
				           class Books(models.Model):
				                title = models.CharField(max_length=15)
            

模型Books类 就对应着数据库中的一张表 Books类的属性title对应着数据库Books表的一个字段title       
     
ps:django内部内置ORM框架


2.什么是QuerySet?

查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。

2.如何从数据库中获取数据

① Django内嵌ORM框架,ORM可以将类和数据表对应起来,只需要通过类和对象对数据表进行操作。
② 通过模型类操作数据表(Django通过给Model增加一个objects属性来提供数据库操作的接口)

:拿到所有书籍的数据 Books.objects.all() 就能拿到QuerySet对象 这个对象中包含我们刚刚所有书籍的数据,顾又名查询集。

当我们需要用到它时 它才会从数据库中获取数据

可能有人会有疑问 会什么是需要用到数据时 才会去数据库查询 而不是执行查询语句时就立马去数据库中查询数据,其原因在于,你听我慢慢道来
  
  这源于查询集的特性:
   
    ①惰性查询:只有在实际使用查询集中的数据的时候才会发生对数据库的真正查询
    ②缓存:当使用的是同一个查询集时,第一次的时候会发生实际数据库的查询,然后
    把结果缓存起来,之后再使用这个查询集时,使用的是缓存中的结果

  例如:posts = Post.objects.all()  #返回一个QuerySet对象赋值给posts 
         available_posts = posts.fillter(status=1) #继续返回一个QuerySet对象并赋值给available_posts 
         print(available_posts)#此时会根据上面的两个条件执行数据查询操作,对应的SQL语句为:
          SELECT * FROM blog_post where status =1;

因此 Django中的QuerySet本质上是一个懒加载对象,其主要原因是因为QuerySet支持链式调用


链式调用就是执行一个对象中的方法之后得到的结果还是这个对象
这样可以接着执行对象上的其他方法。

posts = Post.objects.filter(status=1).filter(category_id=2).filter(title_icontains=“Django”)

看到这我想大家已经柳暗花明又一村了吧,上面在每个方法的执行结果上可以继续调用同样的方法,因为每个方法的返回值就是它自己(QuerySet)

3.QuerySet常用的查询函数

通过模型类.objects属性可以调用如下函数,实现对模型类对象的数据表的查询.
函数名 功能 返回值 说明
get 返回模型类对应数据表中
满足条件的一条
且只能有一条数据
模型类对象 参数中写查询条件
①如果查到多条数据,则抛出异常:MultipleObjectsReturned
②查询不到数据,则抛出异常DoesNotExist
all 返回模型类对应数据表中所有数据 QuerySet 用于查询所有数据
filter 返回满足条件的数据 QuerySet 参数写查询条件
exclude 返回不满足条件的数据 QuerySet 参数写查询条件
order_by 对查询结果进行排序 QuerySet 参数中写根据哪些字段进行排序

ps: 查询条件格式: 模型类属性名__条件名=值(双下划线)
  
①判等 条件名:exact
  
  :查询编号为1的图书.
  
  Books.objects.get(id__exact=1) or Books.objects.get(id=1)    [exact可以省略]
  
模糊查询
  
  :查询书名包含’传’的图书 contains
  
  Books.objects.filter(btitle__contains=‘传’)
  
  :查询书名以‘情人节’结尾的图书 结尾: endswith 开头:startswith
  
  Books.objects.filter(btitle__endswith=‘情人节’)

③空查询 isnull
  
  :查询书名不能为空的图书.
  
  Books.objects.filter(btitle__isnull=False)

④范围查询 in  
  
  :查询id为1或3或5的图书。
  
   Books.objects.filter(id__in = [1,3,5])

⑤比较查询 大于 gt (greate than) 小于 lt (less than) 等于 e(equal) gte大于等于 lte小于等于
  
  :查询编号大于6的图书。
  
  Books.objects.filter(id__gt=6)

日期查询
  
  :查询1999年发表的图书
  
  Books.objects.filter(bpub_date__year=1999)
  
  :查询1999年6月6日后发表的图书。
  
  Books.objects.filter(bpub_date__gt=date(1999.6.6))

exclude方法示例
  
  :查询id不为6的图书信息
  
  Books.objects.exclude(id=6)

order_by方法示例
  
  :查询所有图书信息,按照id从小到大进行排序.
  
  Books.objects.all().order_by(‘id’) or Books.objects.order_by(‘id’)
  
  :查询所有图书信息,按照id从大到小进行排序.
  
  Books.objects.all().order_by(’-id’) or Books.objects.order_by(’-id’)
  
  :把id大于3的图书信息按阅读量从大到小排序显示
  
  Books.objects.filter(id__gt=3).order_by(’-bread’)

4.复杂查询:

Q对象 :用于查询条件之间的逻辑关系。not and or ,可以对Q对象进行&|~操作

ps:使用之前需要导入:from django.db.models import Q
  
  :查询id大于3且阅读量大于30的图书信息
  
  Books.objects.filter(id__gt=3,bread__gt=30)
  
  Books.objects.filter(Q(id__gt=3)&Q(bread__gt=30))
  
  :查询id大于3或阅读量大于30的图书信息
  
  Books.objects.filter(Q(id__gt=3)|Q(bread__gt=30))
  
  :查询id不等于3图书的信息。
  
  Books.objects.filter(~Q(id=3))

F对象:用于类属性之间的比较

ps:使用之前需要导入:from django.db.models import F
  
  :查询图书阅读量大于评论量的图书信息。
  
  Books.objects.filter(bread__gt=F(‘bcomment’))
  
  :查询图书阅读量大于2倍评论量的图书信息。
  
  Books.objects.filter(bread__gt=F(‘bcomment’)*2)

聚合函数:对查询结果进行聚合操作
  
  sum count avg max min
  
  aggregate:调用这个函数来使用聚合.返回值是一个字典
  
  使用前需先导入聚合类:
  
  from django.db.models import Sum,Count,Max,Min,Avg
  
  :查询所有图书的数目。
  
  Books.objects.all().aggregate(Count(‘id’)) or Books.objects.aggregate(Count(‘id’))
  返回值是一个字典 {‘id__count’:5}
  
  :查询所有图书阅读量的总和
  
  Books.objects.all().aggregate(Sum(‘bread’)) or Books.objects.aggregate(Sum(‘bread’))
  返回值是一个字典 {‘bread__sum’:5}
  
count函数:统计满足条件数据的数目, 返回值是一个数字
  
  :统计所有图书的数目。
  
  Books.objects.all().count() or Books.objects.count()
  
  :统计id大于3的所有图书数目
  
  Books.objects.filter(id__gt=3).count()

限制查询集:可以对一个查询集进行取下标或切片操作来限制查询集的结果

对一个查询集进行切片操作会产生一个新的查询集,下标不允许为负数。

取出查询集第一条数据的两种方式:

方式 说明
b[0] 如果b[0]不存在,会抛出IndexError异常/td>
b[0:1].get() 如果b[0:1].get()不存在,会抛出DoesNotExist异常

exists:判断一个查询集中是否有数据。返回值(True or False)

以上只是部分常用的查询方法 具体还请查阅官方文档

Django之QuerySet浅谈 over
也很开心能和大家一起探讨 评论见

我是阿琦 还在不断奔跑

发布了2 篇原创文章 · 获赞 3 · 访问量 2774

猜你喜欢

转载自blog.csdn.net/weixin_42267724/article/details/104295988