как уменьшить количество подсказок к базе данных в Django ORM? - PullRequest
1 голос
/ 05 мая 2020

У меня есть несколько моделей:

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

спасибо

1 Ответ

1 голос
/ 31 мая 2020

Одна проблема заключается в том, что C не имеет поля, указывающего на D. Итак, в вашем шаблоне строка: {% for d in b.c.d_set.all %} будет иметь проблемы с производительностью при обратном поиске. Я бы предложил что-то вроде this , которое показывает вам, как кэшировать связанные поля из обратного поиска, чтобы оптимизировать ваши запросы.

...