Fixes ordering bug with related fields in SearchFilter

This commit is contained in:
Piotr Grabowski 2016-07-25 00:00:21 +02:00
parent 0f61c9ec29
commit f3f1d429c9
2 changed files with 34 additions and 1 deletions

View File

@ -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)

View File

@ -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)