summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2021-04-26 09:30:40 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-04-27 10:37:13 +0200
commitfbea64b8ce6a82dd34b1f78cb884306455106185 (patch)
treea12f81a6caf15143d2a8f04ee136c638d07eedfa /django
parent7ad7034054c10bfa919ceec4623fa7f30a68bba2 (diff)
[3.2.x] Refs #32682 -- Renamed use_distinct variable to may_have_duplicates.
QuerySet.distinct() is not the only way to avoid duplicate, it's also not preferred. Backport of cd74aad90e09865ae6cd8ca0377ef0a5008d14e9 from main
Diffstat (limited to 'django')
-rw-r--r--django/contrib/admin/options.py10
-rw-r--r--django/contrib/admin/views/main.py16
2 files changed, 15 insertions, 11 deletions
diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index c38901e874..6eba48f138 100644
--- a/django/contrib/admin/options.py
+++ b/django/contrib/admin/options.py
@@ -1019,7 +1019,7 @@ class ModelAdmin(BaseModelAdmin):
# Otherwise, use the field with icontains.
return "%s__icontains" % field_name
- use_distinct = False
+ may_have_duplicates = False
search_fields = self.get_search_fields(request)
if search_fields and search_term:
orm_lookups = [construct_search(str(search_field))
@@ -1030,9 +1030,11 @@ class ModelAdmin(BaseModelAdmin):
or_queries = [models.Q(**{orm_lookup: bit})
for orm_lookup in orm_lookups]
queryset = queryset.filter(reduce(operator.or_, or_queries))
- use_distinct |= any(lookup_needs_distinct(self.opts, search_spec) for search_spec in orm_lookups)
-
- return queryset, use_distinct
+ may_have_duplicates |= any(
+ lookup_needs_distinct(self.opts, search_spec)
+ for search_spec in orm_lookups
+ )
+ return queryset, may_have_duplicates
def get_preserved_filters(self, request):
"""
diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py
index fefed29933..dc43e7849d 100644
--- a/django/contrib/admin/views/main.py
+++ b/django/contrib/admin/views/main.py
@@ -122,7 +122,7 @@ class ChangeList:
def get_filters(self, request):
lookup_params = self.get_filters_params()
- use_distinct = False
+ may_have_duplicates = False
has_active_filters = False
for key, value in lookup_params.items():
@@ -157,7 +157,7 @@ class ChangeList:
# processes. If that happened, check if distinct() is needed to
# remove duplicate results.
if lookup_params_count > len(lookup_params):
- use_distinct = use_distinct or lookup_needs_distinct(self.lookup_opts, field_path)
+ may_have_duplicates |= lookup_needs_distinct(self.lookup_opts, field_path)
if spec and spec.has_output():
filter_specs.append(spec)
if lookup_params_count > len(lookup_params):
@@ -203,9 +203,9 @@ class ChangeList:
try:
for key, value in lookup_params.items():
lookup_params[key] = prepare_lookup_value(key, value)
- use_distinct = use_distinct or lookup_needs_distinct(self.lookup_opts, key)
+ may_have_duplicates |= lookup_needs_distinct(self.lookup_opts, key)
return (
- filter_specs, bool(filter_specs), lookup_params, use_distinct,
+ filter_specs, bool(filter_specs), lookup_params, may_have_duplicates,
has_active_filters,
)
except FieldDoesNotExist as e:
@@ -445,7 +445,7 @@ class ChangeList:
self.filter_specs,
self.has_filters,
remaining_lookup_params,
- filters_use_distinct,
+ filters_may_have_duplicates,
self.has_active_filters,
) = self.get_filters(request)
# Then, we let every list filter modify the queryset to its liking.
@@ -480,7 +480,9 @@ class ChangeList:
qs = qs.order_by(*ordering)
# Apply search results
- qs, search_use_distinct = self.model_admin.get_search_results(request, qs, self.query)
+ qs, search_may_have_duplicates = self.model_admin.get_search_results(
+ request, qs, self.query,
+ )
# Set query string for clearing all filters.
self.clear_all_filters_qs = self.get_query_string(
@@ -488,7 +490,7 @@ class ChangeList:
remove=self.get_filters_params(),
)
# Remove duplicates from results, if necessary
- if filters_use_distinct | search_use_distinct:
+ if filters_may_have_duplicates | search_may_have_duplicates:
return qs.distinct()
else:
return qs