如何减少 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 这样的东西,它向您展示了如何从反向查找中缓存相关字段,以优化您的查询。