diff options
| author | Chris Adams <chris@improbable.org> | 2013-10-07 10:48:19 -0400 |
|---|---|---|
| committer | Simon Charette <charette.s@gmail.com> | 2013-10-07 13:10:52 -0400 |
| commit | 698dd82eee1cb83f51d4cd39546461bf76976b5e (patch) | |
| tree | a705df5116c60757005a8dc5bb0ca06be079beb0 /django | |
| parent | 617aceb1b4ec97b4d70f9b3071cb46a645f69f87 (diff) | |
Fixed #21241 -- Avoid extraneous JOINs in admin changelist search.
Diffstat (limited to 'django')
| -rw-r--r-- | django/contrib/admin/options.py | 10 |
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): |
