【问题标题】:how can I reduce database hints in Django ORM?如何减少 Django ORM 中的数据库提示?
【发布时间】:2020-08-19 21:09:03
【问题描述】:

我有一些模型:

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

谢谢

【问题讨论】:

    标签: django performance orm django-queryset


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-24
      • 2016-07-10
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 2017-10-17
      • 2019-05-30
      • 1970-01-01
      相关资源
      最近更新 更多