摄像网站建设,合肥租房网,做营养的网站,乐山建网站上一篇Django 2.1.7 模型 - 条件查询 F对象 Q对象 聚合查询讲述了关于Django模型的介绍F对象、Q对象、聚合查询等功能。不管什么查询#xff0c;返回的结果都基本是查询集QuerySet#xff0c;如下#xff1a;In [16]: MiddlewareInfo.objects.all()Out[16]: 1), 2),… 上一篇Django 2.1.7 模型 - 条件查询 F对象 Q对象 聚合查询讲述了关于Django模型的介绍F对象、Q对象、聚合查询等功能。不管什么查询返回的结果都基本是查询集QuerySet如下In [16]: MiddlewareInfo.objects.all()Out[16]: 1), 2), MiddlewareInfo object (3), 4), 5), reInfo: MiddlewareInfo object (6), ...其中查询集具有缓存、返回多个值、返回单个值、对查询集切片处理等功能。参考文献https://docs.djangoproject.com/zh-hans/2.1/topics/db/queries/#caching-and-querysets返回查询集的过滤器如下all()返回所有数据。filter()返回满足条件的数据。exclude()返回满足条件之外的数据相当于sql语句中where部分的not关键字。order_by()对结果进行排序。返回单个值的过滤器如下get()返回单个满足条件的对象如果未找到会引发模型类.DoesNotExist异常。如果多条被返回会引发模型类.MultipleObjectsReturned异常。count()返回当前查询结果的总条数。aggregate()聚合返回一个字典。判断某一个查询集中是否有数据exists()判断查询集中是否有数据如果有则返回True没有则返回False。In [18]: MiddlewareInfo.objects.filter( server_id__exact 2 )Out[18]: 3), 4), MiddlewareInfo object (12), 13)]In [19]: MiddlewareInfo.objects.filter( server_id__exact 2 ).exists()Out[19]: TrueIn [20]: MiddlewareInfo.objects.filter( server_id__exact 3 )Out[20]: In [21]: MiddlewareInfo.objects.filter( server_id__exact 3 ).exists()Out[21]: False两大特性惰性执行创建查询集不会访问数据库直到调用数据时才会访问数据库调用数据的情况包括迭代、序列化、与if合用。缓存使用同一个查询集第一次使用时会发生数据库的查询然后把结果缓存下来再次使用这个查询集时会使用缓存的数据。查询集的缓存每个查询集都包含一个缓存来最小化对数据库的访问。在新建的查询集中缓存为空首次对查询集求值时会发生数据库查询django会将查询的结果存在查询集的缓存中并返回请求的结果接下来对查询集求值将重用缓存中的结果。示例一经过存储后可以重用查询集第二次使用缓存中的数据。In [29]: list MiddlewareInfo.objects.filter( server_id__exact 2 )In [30]: [ item.name for item in list ]Out[30]: [nginx, kafka, mysql, mongodb]In [31]: [ item.name for item in list ]Out[31]: [nginx, kafka, mysql, mongodb]使用这种方式读取查询集访问mysql中执行SQL的次数只有第一次读取的时候执行。mysql日志如下示例二如下是两个查询集无法重用缓存每次查询都会与数据库进行一次交互增加了数据库的负载。In [32]: [ item.name for item in MiddlewareInfo.objects.filter( server_id__exact 2 ) ]Out[32]: [nginx, kafka, mysql, mongodb]In [33]: [ item.name for item in MiddlewareInfo.objects.filter( server_id__exact 2 ) ]Out[33]: [nginx, kafka, mysql, mongodb]可以看到每次读取list的数据时都进行这个查询集的执行所以mysql执行日志有两次如下限制查询集可以对查询集进行取下标或切片操作等同于sql中的limit和offset子句。注意不支持负数索引。”对查询集进行切片后返回一个新的查询集不会立即执行查询。如果获取一个对象直接使用[0]等同于[0:1].get()但是如果没有数据[0]引发IndexError异常[0:1].get()如果没有数据引发DoesNotExist异常。示例如下In [34]: MiddlewareInfo.objects.all()[0:2]Out[34]: 1), 2)]In [35]: MiddlewareInfo.objects.all()[0:1]Out[35]: 1)]In [36]: MiddlewareInfo.objects.all()[0]Out[36]: 1)