Skip to content

Commit 2fef1c8

Browse files
committed
Only split search terms when testing for 'contains'
1 parent 4afc09d commit 2fef1c8

File tree

2 files changed

+14
-12
lines changed

2 files changed

+14
-12
lines changed

django_select2/forms.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
4848
"""
4949
import uuid
50-
from functools import reduce
5150
from itertools import chain
5251
from pickle import PicklingError # nosec
5352

@@ -399,16 +398,18 @@ def filter_queryset(self, request, term, queryset=None, **dependent_fields):
399398
select = Q()
400399
term = term.replace("\t", " ")
401400
term = term.replace("\n", " ")
402-
for t in [t for t in term.split(" ") if not t == ""]:
403-
select &= reduce(
404-
lambda x, y: x | Q(**{y: t}),
405-
search_fields[1:],
406-
Q(**{search_fields[0]: t}),
407-
)
408-
select |= Q(**{search_fields[0]: term})
401+
402+
for field in search_fields:
403+
field_select = Q()
404+
if "contains" in field:
405+
for t in [t for t in term.split(" ") if not t == ""]:
406+
field_select &= Q(**{field: t})
407+
else:
408+
field_select = Q(**{field: term})
409+
select |= field_select
410+
409411
if dependent_fields:
410412
select &= Q(**dependent_fields)
411-
412413
return queryset.filter(select).distinct()
413414

414415
def get_queryset(self):

tests/test_forms.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -454,11 +454,12 @@ def test_starts_with_filter_queryset(self, genres):
454454
widget = TitleModelSelect2Widget(
455455
search_fields=["title__istartswith"], queryset=Genre.objects.all()
456456
)
457-
qs = widget.filter_queryset(
458-
None, "Space Gen"
459-
)
457+
qs = widget.filter_queryset(None, "Space Gen")
460458
assert qs.exists()
461459

460+
qs = widget.filter_queryset(None, "Gen")
461+
assert not qs.exists()
462+
462463
def test_model_kwarg(self):
463464
widget = ModelSelect2Widget(model=Genre, search_fields=["title__icontains"])
464465
genre = Genre.objects.last()

0 commit comments

Comments
 (0)