diff --git a/src/dal/views.py b/src/dal/views.py index 727d24b4e..69fe0c33b 100644 --- a/src/dal/views.py +++ b/src/dal/views.py @@ -145,14 +145,18 @@ def get_search_results(self, queryset, search_term): ] queryset = queryset.filter(reduce(operator.or_, or_queries)) - if any( - lookup_needs_distinct(queryset.model._meta, search_spec) - for search_spec in orm_lookups - ): + if self.lookup_needs_distinct(queryset, orm_lookups): queryset = queryset.distinct() return queryset + def lookup_needs_distinct(self, queryset, orm_lookups): + """Return True if an orm_lookup requires calling qs.distinct().""" + return any( + lookup_needs_distinct(queryset.model._meta, search_spec) + for search_spec in orm_lookups + ) + def create_object(self, text): """Create an object given a text.""" return self.get_queryset().get_or_create( diff --git a/src/dal_queryset_sequence/views.py b/src/dal_queryset_sequence/views.py index 13278f661..117503583 100644 --- a/src/dal_queryset_sequence/views.py +++ b/src/dal_queryset_sequence/views.py @@ -64,3 +64,9 @@ def get_model_name(self, model): except IndexError: pass return model._meta.verbose_name + + def lookup_needs_distinct(self, queryset, orm_lookups): + """Return True if a orm_lookups requires calling qs.distinct().""" + for qs in queryset._querysets: + if super().lookup_needs_distinct(qs, orm_lookups): + return True diff --git a/test_project/select2_generic_foreign_key/test_views.py b/test_project/select2_generic_foreign_key/test_views.py new file mode 100644 index 000000000..4ff8e959f --- /dev/null +++ b/test_project/select2_generic_foreign_key/test_views.py @@ -0,0 +1,12 @@ +import pytest + +from django import test +from django.urls import reverse + +from .forms import TForm + + +@pytest.mark.django_db +def test_search(client): + url = reverse(TForm.declared_fields['test2'].as_url(TForm).name) + response = client.get(url + '?q=test+1').json()