diff --git a/rest_framework/filters.py b/rest_framework/filters.py index caff1c17f..aaf313491 100644 --- a/rest_framework/filters.py +++ b/rest_framework/filters.py @@ -174,8 +174,8 @@ class SearchFilter(BaseFilterBackend): """ Return True if 'distinct()' should be used to query the given lookups. """ - opts = queryset.model._meta for search_field in search_fields: + opts = queryset.model._meta if search_field[0] in self.lookup_prefixes: search_field = search_field[1:] parts = search_field.split(LOOKUP_SEP) diff --git a/tests/test_filters.py b/tests/test_filters.py index 8bffd215c..6baf7c17e 100644 --- a/tests/test_filters.py +++ b/tests/test_filters.py @@ -450,6 +450,39 @@ class SearchFilterTests(TestCase): reload_module(filters) +class AttributeModelForeign(models.Model): + label = models.CharField(max_length=32) + + +class SearchFilterModelForeign(models.Model): + title = models.CharField(max_length=20) + text = models.CharField(max_length=100) + attribute = models.ForeignKey(AttributeModelForeign) + + +class SearchFilterForeignSerializer(serializers.ModelSerializer): + class Meta: + model = SearchFilterModelForeign + fields = '__all__' + + +class SearchFilterForeignTests(TestCase): + def test_must_call_distinct(self): + filter_ = filters.SearchFilter() + prefixes = [''] + list(filter_.lookup_prefixes) + for prefix in prefixes: + self.assertFalse( + filter_.must_call_distinct( + SearchFilterModelForeign._meta, ["%sattribute__label" % prefix, "%stitle" % prefix] + ) + ) + self.assertFalse( + filter_.must_call_distinct( + SearchFilterModelForeign._meta, ["%stitle" % prefix, "%sattribute__label" % prefix] + ) + ) + + class AttributeModel(models.Model): label = models.CharField(max_length=32)