У меня есть информационная модель с глубокими и сложными связями по внешним ключам. и много их. Из-за этого я пытаюсь использовать 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()
методу. Это тоже не сработало.