Я пытаюсь найти оптимальный способ выполнения запроса, но меня запутали варианты использования prefetch_related и select_related.
У меня есть отношение к внешнему ключу из 3 таблиц: A -> имеет 1-многие B h-> как 1-многие C.
class A(models.model):
...
class B(models.model):
a = models.ForeignKey(A)
class C(models.model):
b = models.ForeignKey(B)
data = models.TextField(max_length=50)
Я пытаюсь получить список всех C.data для всех экземпляров A, которые соответствуют критерию (экземпляр A и все его дочерние элементы), поэтому у меня есть что-то вроде этого:
qs1 = A.objects.all().filter(Q(id=12345)|Q(parent_id=12345))
qs2 = C.objects.select_related('B__A').filter(B__A__in=qs1)
Но я настороженно отношусь к ( Prefetch docs заявив, что:
любые последующие цепочечные методы, которые подразумевают другой запрос к базе данных.
будет игнорировать ранее кэшированные результаты и извлекать данные, используя свежие
запрос к базе данных
Я не знаю, применимо ли это здесь (потому что я использую select_related), но при чтении этого создается впечатление, что что-то, полученное от выполнения select_related, теряется, как только я делаю фильтр.
Является ли мой запрос из двух частей настолько оптимальным, насколько это возможно? Я не думаю, что мне нужна предварительная выборка, насколько я знаю, хотя я заметил, что могу поменять select_related с prefetch_related и получить тот же результат.