django - 如何减少 Django ORM 中的数据库提示?
问题描述
我有一些模型:
F ---> D ---> C <--- B ---> A
class A:
-
class B:
a = ForeignKey
c = ForeignKey
class C:
-
class D:
c = ForeignKey
class F:
d = ForeignKey
我正在使用这个查询:
querset = B.objects.select_related('c').filter(a=a_instance)
在模板中显示结果:
{% for b in querset %}
{% for d in b.c.d_set.all %}
{% for f in d.f_set.all %}
{% endfor %}
{% endfor %}
{% endfor %}
如何减少数据库提示?可以像这样使用 Prefetch 还是我错了?
querset = B.objects.select_related(
'c'
).prefetch_related(
Prefetch('c__d_set__f_set')
).filter(
a=a_instance
)
django = 2.2
谢谢
解决方案
一个问题是 C 没有指向 D 的字段。因此,在您的模板中,行:{% for d in b.c.d_set.all %}
将在反向查找时出现性能问题。我建议像这样,它向您展示如何缓存反向查找中的相关字段,以优化您的查询。
推荐阅读
- docker - 关于 docker-compose up 时 docker 容器的退出
- c# - 升级到 3.1 c# 时请求实体为 Null
- reactjs - Tailwind CSS:伪类之前
- spring-boot - 春季启动 2.2.5。如何在 Spring Filter 中检索 PathVariable 参数
- php - 关于 devicetoken 的 APNS 问题不适用于 PHP 中的主题和错误的设备令牌
- python - 行上指定范围内的单元格值
- java - Spring Batch Writer 接收到错误的对象类型
- html - 跨度元素上的动态 CSS 类 - 角度 7
- javascript - 访问特定行数据表
- performance - 了解在 dockercontainer 中运行的本机映像的内存占用和使用情况的最佳方法是什么?