Использование django select_related с дополнительным фильтром - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь найти оптимальный способ выполнения запроса, но меня запутали варианты использования 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 и получить тот же результат.

1 Ответ

0 голосов
/ 26 октября 2018

Я думаю, что ваш вопрос вызван заблуждением. select_relatedprefetch_related) - это оптимизация , специально для возврата значений в связанных моделях вместе с исходным запросом. Они никогда не требуются.

Более того, ни один из них не оказывает никакого влияния на filter. Django автоматически выполнит соответствующие объединения и подзапросы, чтобы выполнить ваш запрос, независимо от того, используете ли вы select_related.

...