【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
相关推荐
东莞市云毅网络有限公司2 小时前
企业资料时效性判定:Last-Modified、正文日期与版本字段三路交叉
python·sqlite·自动化运维·geo·数据监测
许彰午3 小时前
01-Oracle数据库简介与版本选择
数据库·oracle
菜鸟~noob2333 小时前
【电子战】第三季预告—波武器与电子系统强力毁伤
开发语言·数据库·matlab·电子战
Seraphina365 小时前
SQL注入(二)盲注
网络·数据库·经验分享·笔记·sql
盟接之桥6 小时前
AI助手:你的7×24小时智能管家——让异常预警无处不在
大数据·网络·数据库·人工智能·制造·ai编程
waoooqwe6 小时前
问卷样本真实吗
大数据·数据库·算法·数据分析
可乐ea7 小时前
Agent 评测换判据:用终态数据库状态判定任务是否完成
数据库·ui·oracle·mcp工具·agent评测·终态断言·智能体可靠性
l1t7 小时前
DeepSeek总结的一个不含数据的 DuckDB 数据库
服务器·数据库·duckdb
PaperData8 小时前
2007-2020年税收调查面板数据
数据库
程序员清风8 小时前
CSV、Excel 与数据库数据读取实践
数据库·oracle·excel