Django Prefetch related_name не отображается при использовании множественного поиска - PullRequest
0 голосов
/ 04 марта 2019

Когда я использую объект предварительной выборки django (https://docs.djangoproject.com/en/2.2/ref/models/querysets/#prefetch-objects) в нескольких полях, например:

model_a.objects.prefetch_related(Prefetch(model_b__model_c), to_attr='data')

, где model_a имеет отношение m2m к model_b, а model_c имеет внешний ключ model_b. Iпохоже, что в элементах возвращенного QuerySet нет поля 'data'.

Возможно, я смотрю не в том месте?

1 Ответ

0 голосов
/ 04 марта 2019

Прежде всего, на основе описанных вами отношений, объект Prefetch должен быть сконструирован следующим образом (если вы не определили related_name для отношений, в этом случае вам нужно связанное имя без добавления _set):

Prefetch('model_b_set__model_c_set')

Во-вторых, вы фактически делаете две предварительные выборки:

  • Первая выбирает все model_b экземпляров для каждого model_a.
  • Второй извлекает все model_c экземпляров для каждого model_b.

data определен для второй предварительной выборки, т.е.на model_b экземплярах, а не на model_a, и он будет содержать список model_c экземпляров.Таким образом, вы получите к нему доступ так:

a_models = ModelA.objects.prefetch_related(
    Prefetch('model_b_set__model_c_set'), 
    to_attr='data')
for a in a_models:
    for b in a.model_b_set.all():
        b.data # => contains a list of model_c instances
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...