diff options
Diffstat (limited to 'django/contrib/admin/views/main.py')
| -rw-r--r-- | django/contrib/admin/views/main.py | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py index dc43e7849d..a54ef25f23 100644 --- a/django/contrib/admin/views/main.py +++ b/django/contrib/admin/views/main.py @@ -17,7 +17,7 @@ from django.core.exceptions import ( FieldDoesNotExist, ImproperlyConfigured, SuspiciousOperation, ) from django.core.paginator import InvalidPage -from django.db.models import F, Field, ManyToOneRel, OrderBy +from django.db.models import Exists, F, Field, ManyToOneRel, OrderBy, OuterRef from django.db.models.expressions import Combinable from django.urls import reverse from django.utils.http import urlencode @@ -472,13 +472,6 @@ class ChangeList: # ValueError, ValidationError, or ?. raise IncorrectLookupParameters(e) - if not qs.query.select_related: - qs = self.apply_select_related(qs) - - # Set ordering. - ordering = self.get_ordering(request, qs) - qs = qs.order_by(*ordering) - # Apply search results qs, search_may_have_duplicates = self.model_admin.get_search_results( request, qs, self.query, @@ -491,9 +484,17 @@ class ChangeList: ) # Remove duplicates from results, if necessary if filters_may_have_duplicates | search_may_have_duplicates: - return qs.distinct() - else: - return qs + qs = qs.filter(pk=OuterRef('pk')) + qs = self.root_queryset.filter(Exists(qs)) + + # Set ordering. + ordering = self.get_ordering(request, qs) + qs = qs.order_by(*ordering) + + if not qs.query.select_related: + qs = self.apply_select_related(qs) + + return qs def apply_select_related(self, qs): if self.list_select_related is True: |
