|
6 | 6 | from django.utils import six
|
7 | 7 | from rest_framework import serializers
|
8 | 8 | from rest_framework.exceptions import ValidationError
|
| 9 | +from rest_framework.fields import BooleanField, NullBooleanField |
9 | 10 | from rest_framework.filters import BaseFilterBackend, OrderingFilter
|
10 | 11 |
|
11 | 12 | from dynamic_rest.conf import settings
|
@@ -81,6 +82,7 @@ def generate_query_key(self, serializer):
|
81 | 82 | rewritten = []
|
82 | 83 | last = len(self.field) - 1
|
83 | 84 | s = serializer
|
| 85 | + field = None |
84 | 86 | for i, field_name in enumerate(self.field):
|
85 | 87 | # Note: .fields can be empty for related serializers that aren't
|
86 | 88 | # sideloaded. Fields that are deferred also won't be present.
|
@@ -128,7 +130,7 @@ def generate_query_key(self, serializer):
|
128 | 130 | if self.operator:
|
129 | 131 | rewritten.append(self.operator)
|
130 | 132 |
|
131 |
| - return '__'.join(rewritten) |
| 133 | + return ('__'.join(rewritten), field) |
132 | 134 |
|
133 | 135 |
|
134 | 136 | class DynamicFilterBackend(BaseFilterBackend):
|
@@ -283,7 +285,9 @@ def _filters_to_query(self, includes, excludes, serializer, q=None):
|
283 | 285 | def rewrite_filters(filters, serializer):
|
284 | 286 | out = {}
|
285 | 287 | for k, node in six.iteritems(filters):
|
286 |
| - filter_key = node.generate_query_key(serializer) |
| 288 | + filter_key, field = node.generate_query_key(serializer) |
| 289 | + if isinstance(field, (BooleanField, NullBooleanField)): |
| 290 | + node.value = node.value.lower() not in self.FALSEY_STRINGS |
287 | 291 | out[filter_key] = node.value
|
288 | 292 |
|
289 | 293 | return out
|
|
0 commit comments