mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-11-26 11:33:59 +03:00
Merge pull request #3103 from tomchristie/trollknurr-master
Ensure no duplication of results with SearchFilter with Oracle databases.
This commit is contained in:
commit
21ec3b506a
|
@ -7,6 +7,7 @@ from __future__ import unicode_literals
|
||||||
import operator
|
import operator
|
||||||
from functools import reduce
|
from functools import reduce
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils import six
|
from django.utils import six
|
||||||
|
@ -59,6 +60,7 @@ class DjangoFilterBackend(BaseFilterBackend):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = queryset.model
|
model = queryset.model
|
||||||
fields = filter_fields
|
fields = filter_fields
|
||||||
|
|
||||||
return AutoFilterSet
|
return AutoFilterSet
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
@ -100,13 +102,20 @@ class SearchFilter(BaseFilterBackend):
|
||||||
if not search_fields:
|
if not search_fields:
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
original_queryset = queryset
|
||||||
orm_lookups = [self.construct_search(six.text_type(search_field))
|
orm_lookups = [self.construct_search(six.text_type(search_field))
|
||||||
for search_field in search_fields]
|
for search_field in search_fields]
|
||||||
|
|
||||||
for search_term in self.get_search_terms(request):
|
for search_term in self.get_search_terms(request):
|
||||||
or_queries = [models.Q(**{orm_lookup: search_term})
|
or_queries = [models.Q(**{orm_lookup: search_term})
|
||||||
for orm_lookup in orm_lookups]
|
for orm_lookup in orm_lookups]
|
||||||
queryset = queryset.filter(reduce(operator.or_, or_queries)).distinct()
|
queryset = queryset.filter(reduce(operator.or_, or_queries))
|
||||||
|
|
||||||
|
if settings.DATABASES[queryset.db]["ENGINE"] == "django.db.backends.oracle":
|
||||||
|
# distinct analogue for Oracle users
|
||||||
|
queryset = original_queryset.filter(pk__in=set(queryset.values_list('pk', flat=True)))
|
||||||
|
else:
|
||||||
|
queryset = queryset.distinct()
|
||||||
|
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user