首页 > 解决方案 > 如何减少 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

谢谢

标签: djangoperformanceormdjango-queryset

解决方案


一个问题是 C 没有指向 D 的字段。因此,在您的模板中,行:{% for d in b.c.d_set.all %}将在反向查找时出现性能问题。我建议像这样,它向您展示如何缓存反向查找中的相关字段,以优化您的查询。


推荐阅读