Skip to content

Commit 2a910c8

Browse files
authored
fix: Handle unhashable BooleanField representation values (#9973)
1 parent c4d5e18 commit 2a910c8

2 files changed

Lines changed: 39 additions & 33 deletions

File tree

rest_framework/fields.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -708,12 +708,13 @@ def to_internal_value(self, data):
708708
self.fail("invalid", input=data)
709709

710710
def to_representation(self, value):
711-
if self._lower_if_str(value) in self.TRUE_VALUES:
712-
return True
713-
elif self._lower_if_str(value) in self.FALSE_VALUES:
714-
return False
715-
if self._lower_if_str(value) in self.NULL_VALUES and self.allow_null:
716-
return None
711+
with contextlib.suppress(TypeError):
712+
if self._lower_if_str(value) in self.TRUE_VALUES:
713+
return True
714+
elif self._lower_if_str(value) in self.FALSE_VALUES:
715+
return False
716+
if self._lower_if_str(value) in self.NULL_VALUES and self.allow_null:
717+
return None
717718
return bool(value)
718719

719720

tests/test_fields.py

Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -774,33 +774,38 @@ class TestBooleanField(FieldValues):
774774
'foo': ['Must be a valid boolean.'],
775775
None: ['This field may not be null.']
776776
}
777-
outputs = {
778-
'True': True,
779-
'TRUE': True,
780-
'tRuE': True,
781-
't': True,
782-
'T': True,
783-
'true': True,
784-
'on': True,
785-
'ON': True,
786-
'oN': True,
787-
'False': False,
788-
'FALSE': False,
789-
'fALse': False,
790-
'f': False,
791-
'F': False,
792-
'false': False,
793-
'off': False,
794-
'OFF': False,
795-
'oFf': False,
796-
'1': True,
797-
'0': False,
798-
1: True,
799-
0: False,
800-
True: True,
801-
False: False,
802-
'other': True
803-
}
777+
outputs = [
778+
('True', True),
779+
('TRUE', True),
780+
('tRuE', True),
781+
('t', True),
782+
('T', True),
783+
('true', True),
784+
('on', True),
785+
('ON', True),
786+
('oN', True),
787+
('False', False),
788+
('FALSE', False),
789+
('fALse', False),
790+
('f', False),
791+
('F', False),
792+
('false', False),
793+
('off', False),
794+
('OFF', False),
795+
('oFf', False),
796+
('1', True),
797+
('0', False),
798+
(1, True),
799+
(0, False),
800+
(True, True),
801+
(False, False),
802+
('other', True),
803+
([], False),
804+
({}, False),
805+
(set(), False),
806+
([1], True),
807+
({'example': 'value'}, True),
808+
]
804809
field = serializers.BooleanField()
805810

806811
def test_disallow_unhashable_collection_types(self):

0 commit comments

Comments
 (0)