mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-11-26 11:33:59 +03:00
thin logic
This commit is contained in:
parent
745d8d0004
commit
e8b23c4789
|
@ -58,6 +58,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
|
||||||
|
@ -98,22 +99,24 @@ class SearchFilter(BaseFilterBackend):
|
||||||
|
|
||||||
if not search_fields:
|
if not search_fields:
|
||||||
return queryset
|
return queryset
|
||||||
|
if settings.DATABASES[queryset.db]["ENGINE"] == "django.db.backends.oracle":
|
||||||
|
# Remember queryset for Oracle db users
|
||||||
|
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]
|
||||||
and_queries = []
|
|
||||||
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]
|
||||||
and_queries.append(reduce(operator.or_, or_queries))
|
queryset = queryset.filter(reduce(operator.or_, or_queries))
|
||||||
|
if settings.DATABASES[queryset.db]["ENGINE"] != "django.db.backends.oracle":
|
||||||
|
# Oracle db don't support distinct on *LOB fields
|
||||||
|
queryset = queryset.distinct()
|
||||||
|
|
||||||
|
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)))
|
||||||
|
|
||||||
if and_queries:
|
|
||||||
# According to Oracle DB limits there is no capability to make a DISTINT on *LOB
|
|
||||||
if settings.DATABASES[queryset.db]["ENGINE"] == "django.db.backends.oracle":
|
|
||||||
pk_list = queryset.filter(reduce(operator.and_, and_queries)).values_list('pk', flat=True)
|
|
||||||
return queryset.filter(pk__in=frozenset(pk_list))
|
|
||||||
else:
|
|
||||||
return queryset.filter(reduce(operator.and_, and_queries)).distinct()
|
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
|
@ -160,7 +163,7 @@ class OrderingFilter(BaseFilterBackend):
|
||||||
field.source or field_name
|
field.source or field_name
|
||||||
for field_name, field in serializer_class().fields.items()
|
for field_name, field in serializer_class().fields.items()
|
||||||
if not getattr(field, 'write_only', False)
|
if not getattr(field, 'write_only', False)
|
||||||
]
|
]
|
||||||
elif valid_fields == '__all__':
|
elif valid_fields == '__all__':
|
||||||
# View explicitly allows filtering on any model field
|
# View explicitly allows filtering on any model field
|
||||||
valid_fields = [field.name for field in queryset.model._meta.fields]
|
valid_fields = [field.name for field in queryset.model._meta.fields]
|
||||||
|
@ -182,6 +185,7 @@ class DjangoObjectPermissionsFilter(BaseFilterBackend):
|
||||||
A filter backend that limits results to those where the requesting user
|
A filter backend that limits results to those where the requesting user
|
||||||
has read object level permissions.
|
has read object level permissions.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
assert guardian, 'Using DjangoObjectPermissionsFilter, but django-guardian is not installed'
|
assert guardian, 'Using DjangoObjectPermissionsFilter, but django-guardian is not installed'
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user