Следование вложенным внешним ключам при предварительной загрузке в Django - PullRequest
1 голос
/ 01 апреля 2019

У меня есть информационная модель с глубокими и сложными связями по внешним ключам. и много их. Из-за этого я пытаюсь использовать select_related() и prefetch_related(), чтобы минимизировать количество запросов к моей БД.

Однако у меня проблема в том, что я не могу найти способ заставить операторов предварительной выборки следовать за внешними ключами на произвольную глубину. Мне известен оператор двойного подчеркивания (__), но на самом деле это не вариант, потому что я заранее не знаю, насколько глубокой будет вложенность.

Например, скажем, у меня есть объекты A, B, C,...Z. Любой объект может иметь произвольное количество внешних ключей, указывающих на любой объект, который появляется, скажем, позже в алфавите. Как я могу убедиться, что, например, предварительная выборка внешнего ключа, который с A указывает на B, будет следовать за всеми внешними ключами на B?

На данный момент лучшим вариантом для меня стал полужесткий подход к методу get_queryset() в диспетчере объектов.

Заранее спасибо

EDIT

Хорошо, идея о том, как я сейчас пытаюсь это сделать, такова:

    class MyModelmanager(model.Manger):
        def get_queryset()
            qs = super().get_queryset()
            qs = qs.select_related(*thefiledsiwannaprefetch)
            return qs

Теперь в полях, которые я предварительно выбираю, есть отношения внешних ключей, которым я хотел бы следовать. Как мне этого добиться (без использования '__')?

РЕДАКТИРОВАТЬ 2

Другая попытка была следующей:

    class MyModelmanager(model.Manger):
        def get_queryset()
            return super().get_queryset().prefetch_related()

Затем я переопределил менеджер других моделей, так что они также выполнили предварительную выборку по их get_queryset() методу. Это тоже не сработало.

1 Ответ

1 голос
/ 01 апреля 2019

Из документов :

Могут быть ситуации, когда вы хотите вызвать select_related () со множеством связанных объектов или когда вы не знаете всех отношений. В этих случаях можно вызывать select_related () без аргументов. Это будет следовать за всеми ненулевыми внешними ключами, которые он может найти - должны быть указаны внешние ключи, которые могут иметь значение NULL. В большинстве случаев это не рекомендуется, так как это может сделать базовый запрос более сложным и вернуть больше данных, чем фактически необходимо.

...