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