summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorChris Adams <chris@improbable.org>2013-10-07 10:48:19 -0400
committerSimon Charette <charette.s@gmail.com>2013-10-07 13:10:52 -0400
commit698dd82eee1cb83f51d4cd39546461bf76976b5e (patch)
treea705df5116c60757005a8dc5bb0ca06be079beb0 /django
parent617aceb1b4ec97b4d70f9b3071cb46a645f69f87 (diff)
Fixed #21241 -- Avoid extraneous JOINs in admin changelist search.
Diffstat (limited to 'django')
-rw-r--r--django/contrib/admin/options.py10
1 files changed, 7 insertions, 3 deletions
diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index 3b02ac020c..f366b5d9bb 100644
--- a/django/contrib/admin/options.py
+++ b/django/contrib/admin/options.py
@@ -849,10 +849,14 @@ class ModelAdmin(BaseModelAdmin):
if search_fields and search_term:
orm_lookups = [construct_search(str(search_field))
for search_field in search_fields]
+
+ query_parts = []
for bit in search_term.split():
- or_queries = [models.Q(**{orm_lookup: bit})
- for orm_lookup in orm_lookups]
- queryset = queryset.filter(reduce(operator.or_, or_queries))
+ or_queries = (models.Q(**{orm_lookup: bit})
+ for orm_lookup in orm_lookups)
+ query_parts.append(reduce(operator.or_, or_queries))
+ queryset = queryset.filter(reduce(operator.and_, query_parts))
+
if not use_distinct:
for search_spec in orm_lookups:
if lookup_needs_distinct(self.opts, search_spec):