Я считаю, что этот код комментарии обеспечивают относительно хороший ответ на общий вопрос, который здесь спрашивает:
Если 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)
вам не поможет.
Я не думаю, что в нашем случае необходим рефакторинг. Простая ситуация - вставьте список объектов в paginator. Немного путайте использование подсчета и внутреннего соединения в одном запросе, где он вообще не нужен (никаких фильтров на связанных таблицах). Спасибо за ответ. Вот и все. –
Как я понимаю, предоставив аргумент select_related, вы задали фильтр в связанной таблице (если вы не укажете никаких аргументов для select_related(), он будет захватывать все связанные объекты, тогда все объекты, связанные с этими объектами и т. д. рекурсивно). –