Джанго.Удалить select_related из набора запросов - PullRequest
3 голосов
/ 10 января 2012

Есть ли способ удалить select, связанный с набором запросов?

Я обнаружил, что django добавляет JOIN при операции count () в SQL-запрос. Итак, если у нас есть такой код:

entities = Entities.objects.select_related('subentity').all()
#We will have INNER JOIN here..
entities.count()

Я ищу способ удалить объединение. Одна важная деталь - я поместил этот набор запросов в django paginator, поэтому я не могу просто написать

Entities.objects.all().count()

Ответы [ 2 ]

3 голосов
/ 26 января 2017

Я считаю, что комментарии к этому коду дают относительно хороший ответ на общий вопрос, который здесь задают:

Если вызывается select_related (None), список очищается.

https://github.com/django/django/blob/stable/1.8.x/django/db/models/query.py#L735

В общем смысле, если вы хотите что-то сделать с набором запросов entities, но сначала удалите из него элементы select_related, entities.select_related(None).

Однако, это, вероятно, не решит вашу конкретную ситуацию с пагинатором. Если вы сделаете entries.count(), то уже удалит элементы select_related. Если вы обнаружите, что происходят дополнительные СОЕДИНЕНИЯ, это может быть несколько неидеальных факторов. Может случиться так, что ORM не сможет удалить его из-за другой логики, которая может влиять или не влиять на счет в сочетании с select_related.

В качестве простого примера одного из этих неидеальных случаев рассмотрим Foo.objects.select_related('bar').count() против Foo.objects.select_related('bar').distinct().count(). Для вас может быть очевидным, что исходный набор запросов не содержит нескольких записей, но это не очевидно для ORM Django. В результате SQL, который выполняется, содержит JOIN, и универсального рецепта для обхода этого не существует. Даже применение .select_related(None) не поможет вам.

1 голос
/ 10 января 2012

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

Если вам нужен быстрый ответ, entities.query.select_related = False, но он довольно хакерский (и не забудьте восстановить значение, если вам понадобится select_related позже).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...