From b8325ee576a6f47f0db4b888e799ee6b7af6b227 Mon Sep 17 00:00:00 2001 From: Dominik Kozaczko Date: Tue, 16 Jul 2013 20:10:24 +0200 Subject: [PATCH 1/7] SimpleDjangoFilter allows straightforward ORM filtering --- rest_framework/filters.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/rest_framework/filters.py b/rest_framework/filters.py index c058bc715..201aefd7e 100644 --- a/rest_framework/filters.py +++ b/rest_framework/filters.py @@ -23,6 +23,17 @@ class BaseFilterBackend(object): raise NotImplementedError(".filter_queryset() must be overridden.") +class SimpleDjangoFilterBackend(BaseFilterBackend): + """ + Really simple class that allows straightforward Django ORM filtering. + """ + def filter_queryset(self, request, queryset, view): + params = {} + for k, v in request.QUERY_PARAMS.iteritems(): + params.update({k:v[0]}) + return queryset.filter(**params) + + class DjangoFilterBackend(BaseFilterBackend): """ A filter backend that uses django-filter. From 4edb973418b6f5be42c258116eef37124c80e9c8 Mon Sep 17 00:00:00 2001 From: Dominik Kozaczko Date: Wed, 17 Jul 2013 09:32:00 +0200 Subject: [PATCH 2/7] support filter_fields - adds compatibility with other filters --- rest_framework/filters.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/rest_framework/filters.py b/rest_framework/filters.py index 201aefd7e..74f26a030 100644 --- a/rest_framework/filters.py +++ b/rest_framework/filters.py @@ -28,9 +28,16 @@ class SimpleDjangoFilterBackend(BaseFilterBackend): Really simple class that allows straightforward Django ORM filtering. """ def filter_queryset(self, request, queryset, view): + filter_fields = getattr('filter_fields', view, None) + if filter_fields is None: + filter_fields = request.QUERY_PARAMS.keys() + # reduce relations to entry point only + fields = [field.split('__')[0] for field in filter_fields.keys()] params = {} for k, v in request.QUERY_PARAMS.iteritems(): - params.update({k:v[0]}) + # if entry point matches, collect the original key + if k.split('__')[0] in fields: + params.update({k: v[0]}) return queryset.filter(**params) From 4898e8d8b414c68fb94caab2e6cfcf03dcadc9d5 Mon Sep 17 00:00:00 2001 From: Dominik Kozaczko Date: Wed, 17 Jul 2013 09:57:47 +0200 Subject: [PATCH 3/7] fix typo --- rest_framework/filters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/filters.py b/rest_framework/filters.py index 74f26a030..fbfcb82b4 100644 --- a/rest_framework/filters.py +++ b/rest_framework/filters.py @@ -28,7 +28,7 @@ class SimpleDjangoFilterBackend(BaseFilterBackend): Really simple class that allows straightforward Django ORM filtering. """ def filter_queryset(self, request, queryset, view): - filter_fields = getattr('filter_fields', view, None) + filter_fields = getattr(view, 'filter_fields', None) if filter_fields is None: filter_fields = request.QUERY_PARAMS.keys() # reduce relations to entry point only From 51d591a54e64758e11c54492227ba5c6e7e57d8b Mon Sep 17 00:00:00 2001 From: Dominik Kozaczko Date: Wed, 17 Jul 2013 09:59:05 +0200 Subject: [PATCH 4/7] fix --- rest_framework/filters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/filters.py b/rest_framework/filters.py index fbfcb82b4..b9005848a 100644 --- a/rest_framework/filters.py +++ b/rest_framework/filters.py @@ -30,7 +30,7 @@ class SimpleDjangoFilterBackend(BaseFilterBackend): def filter_queryset(self, request, queryset, view): filter_fields = getattr(view, 'filter_fields', None) if filter_fields is None: - filter_fields = request.QUERY_PARAMS.keys() + filter_fields = request.QUERY_PARAMS # reduce relations to entry point only fields = [field.split('__')[0] for field in filter_fields.keys()] params = {} From 254a4590d90d6f19522851305612060eea57c28d Mon Sep 17 00:00:00 2001 From: Dominik Kozaczko Date: Wed, 17 Jul 2013 09:59:42 +0200 Subject: [PATCH 5/7] fix --- rest_framework/filters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/filters.py b/rest_framework/filters.py index b9005848a..619eed8a0 100644 --- a/rest_framework/filters.py +++ b/rest_framework/filters.py @@ -32,7 +32,7 @@ class SimpleDjangoFilterBackend(BaseFilterBackend): if filter_fields is None: filter_fields = request.QUERY_PARAMS # reduce relations to entry point only - fields = [field.split('__')[0] for field in filter_fields.keys()] + fields = [field.split('__')[0] for field in filter_fields] params = {} for k, v in request.QUERY_PARAMS.iteritems(): # if entry point matches, collect the original key From 9c4c7440a8b74ec447e6e960d9ac5e958d851609 Mon Sep 17 00:00:00 2001 From: Dominik Kozaczko Date: Wed, 17 Jul 2013 10:06:14 +0200 Subject: [PATCH 6/7] re-fix --- rest_framework/filters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/filters.py b/rest_framework/filters.py index 619eed8a0..d2145ebf6 100644 --- a/rest_framework/filters.py +++ b/rest_framework/filters.py @@ -30,7 +30,7 @@ class SimpleDjangoFilterBackend(BaseFilterBackend): def filter_queryset(self, request, queryset, view): filter_fields = getattr(view, 'filter_fields', None) if filter_fields is None: - filter_fields = request.QUERY_PARAMS + filter_fields = request.QUERY_PARAMS.keys() # reduce relations to entry point only fields = [field.split('__')[0] for field in filter_fields] params = {} From c4cf24c57ccc7ec746fa3a6d2e0983a42c174062 Mon Sep 17 00:00:00 2001 From: Dominik Kozaczko Date: Thu, 18 Jul 2013 10:14:46 +0200 Subject: [PATCH 7/7] sometimes value is a list, sometimes not - handle that --- rest_framework/filters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/filters.py b/rest_framework/filters.py index d2145ebf6..36a77addd 100644 --- a/rest_framework/filters.py +++ b/rest_framework/filters.py @@ -37,7 +37,7 @@ class SimpleDjangoFilterBackend(BaseFilterBackend): for k, v in request.QUERY_PARAMS.iteritems(): # if entry point matches, collect the original key if k.split('__')[0] in fields: - params.update({k: v[0]}) + params.update({k: v[0] if isinstance(v, list) else v}) return queryset.filter(**params)