Skip to content

Commit 380e1e7

Browse files
committed
Add __in filter
Adding a filter capable of handling __in queries for integer fields like for object id.
1 parent d3a6585 commit 380e1e7

File tree

3 files changed

+24
-0
lines changed

3 files changed

+24
-0
lines changed

rest_framework_filters/fields.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from django import forms
2+
3+
class ArrayDecimalField(forms.DecimalField):
4+
def clean(self, value):
5+
out = []
6+
for val in value.split(','):
7+
out.append(super(ArrayDecimalField, self).clean(val))
8+
return out

rest_framework_filters/filters.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import django_filters
99
from django_filters.filters import *
1010

11+
from . import fields
1112

1213
def subsitute_iso8601(date_type):
1314
from rest_framework import ISO_8601
@@ -80,3 +81,16 @@ class TimeFilter(django_filters.DateTimeFilter):
8081
def __init__(self, *args, **kwargs):
8182
super(TimeFilter, self).__init__(*args, **kwargs)
8283
self.extra.update({'input_formats': TIME_INPUT_FORMATS})
84+
85+
86+
class InSetNumberFilter(NumberFilter):
87+
field_class = fields.ArrayDecimalField
88+
89+
def filter(self, qs, value):
90+
if value in ([], (), {}, None, ''):
91+
return qs
92+
method = qs.exclude if self.exclude else qs.filter
93+
qs = method(**{self.name: value})
94+
if self.distinct:
95+
qs = qs.distinct()
96+
return qs

rest_framework_filters/filterset.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ def fix_filter_field(self, f):
7373
lookup_type = f.lookup_type
7474
if lookup_type == 'isnull':
7575
return filters.BooleanFilter(name=("%s%sisnull" % (f.name, LOOKUP_SEP)))
76+
if lookup_type == 'in' and type(f) in [filters.NumberFilter]:
77+
return filters.InSetNumberFilter(name=("%s%sin" % (f.name, LOOKUP_SEP)))
7678
return f
7779

7880
def populate_from_filterset(self, filterset, filter_, name):

0 commit comments

Comments
 (0)