如何减少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 %}

如何减少数据库提示?这样使用预取可以吗?还是我错了?

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 %}在反向查找时会出现性能问题。我建议这样做,它向您展示如何缓存反向查找中的相关字段,以优化查询。

最新更新