2012-01-10 2 views
3

Есть ли способ удалить ссылку, связанную с запросом?Django. Удалить select_related from queryset

Я нашел, что django добавить JOIN на операцию count() в sql-запрос. Так что, если у нас есть такой код:

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

Я ищу способ, чтобы удалить соединение. одна важная деталь - я получил эту QuerySet в Джанго постраничной навигации, так что я не могу просто написать

Entities.objects.all().count() 

ответ

1

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

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

+1

Я не думаю, что в нашем случае необходим рефакторинг. Простая ситуация - вставьте список объектов в paginator. Немного путайте использование подсчета и внутреннего соединения в одном запросе, где он вообще не нужен (никаких фильтров на связанных таблицах). Спасибо за ответ. Вот и все. –

+0

Как я понимаю, предоставив аргумент select_related, вы задали фильтр в связанной таблице (если вы не укажете никаких аргументов для select_related(), он будет захватывать все связанные объекты, тогда все объекты, связанные с этими объектами и т. д. рекурсивно). –

1

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

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

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

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

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

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

Смежные вопросы