如何减少 Django ORM 中的数据库提示?
how can I reduce database hints in 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 %}
将在反向查找时出现性能问题。我建议像 this 这样的东西,它向您展示了如何从反向查找中缓存相关字段,以优化您的查询。
我有一些模型:
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 %}
将在反向查找时出现性能问题。我建议像 this 这样的东西,它向您展示了如何从反向查找中缓存相关字段,以优化您的查询。