【Django】执行查询—检索对象(二)

主键 (pk) 查询快捷方式

pk查询等同于通过模型的 primary key 进行过滤,直接上例子,下面三个语句是等效的。

python 复制代码
>>> Blog.objects.get(id__exact=14)  # Explicit form
>>> Blog.objects.get(id=14)  # __exact is implied
>>> Blog.objects.get(pk=14)  # pk implies id__exact

任何查询条件都可以与 pk 结合使用,pk 查询也可以跨越关联进行。

缓存和 QuerySet

先看一段代码:

python 复制代码
>>> print([e.headline for e in Entry.objects.all()])
>>> print([e.pub_date for e in Entry.objects.all()])

上述代码存在2个问题:

  • 同样的数据库查询会被执行两次,实际加倍了数据库负载;
  • 同时,有可能这两个列表不包含同样的记录,因为在两次请求间,可能有 Entry 被添加或删除了。

因此要学会使用QuerySet缓存。新创建的 QuerySet 缓存是空的。一旦要计算 QuerySet 的值,就会执行数据查询,随后,Django 就会将查询结果保存在 QuerySet 的缓存中,并返回这些显式请求的缓存。因此我们可以优化一下:

python 复制代码
>>> queryset = Entry.objects.all()
>>> print([p.headline for p in queryset])  # Evaluate the query set.
>>> print([p.pub_date for p in queryset])  # Reuse the cache from the evaluation.

QuerySet 没有被缓存的情形

查询结果集并不总是缓存结果。使用数组切片或索引方式得到的 限制查询结果集 不会填充缓存。

例如,反复获取查询集对象中的某个索引会每次查询数据库:

python 复制代码
>>> queryset = Entry.objects.all()
>>> print(queryset[5])  # Queries the database
>>> print(queryset[5])  # Queries the database again

如果整个查询集已经被评估过,那么会检查缓存而不是查询数据库:

python 复制代码
>>> queryset = Entry.objects.all()
>>> [entry for entry in queryset]  # Queries the database
>>> print(queryset[5])  # Uses cache
>>> print(queryset[5])  # Uses cache
相关推荐
草莓熊Lotso27 分钟前
Linux 文件描述符与重定向实战:从原理到 minishell 实现
android·linux·运维·服务器·数据库·c++·人工智能
大模型玩家七七31 分钟前
基于语义切分 vs 基于结构切分的实际差异
java·开发语言·数据库·安全·batch
岳麓丹枫0012 小时前
PostgreSQL 中 pg_wal 目录里的 .ready .done .history 文件的生命周期
数据库·postgresql
陌上丨8 小时前
Redis的Key和Value的设计原则有哪些?
数据库·redis·缓存
AI_56788 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
ccecw8 小时前
Mysql ONLY_FULL_GROUP_BY模式详解、group by非查询字段报错
数据库·mysql
JH30738 小时前
达梦数据库与MySQL的核心差异解析:从特性到实践
数据库·mysql
数据知道9 小时前
PostgreSQL 核心原理:如何利用多核 CPU 加速大数据量扫描(并行查询)
数据库·postgresql
麦聪聊数据10 小时前
Web 原生架构如何重塑企业级数据库协作流?
数据库·sql·低代码·架构
未来之窗软件服务10 小时前
数据库优化提速(四)新加坡房产系统开发数据库表结构—仙盟创梦IDE
数据库·数据库优化·计算机软考