From 7c99449e866bd4a212d308e45d9772e5ce8cd226 Mon Sep 17 00:00:00 2001 From: emfpdlzj Date: Thu, 28 May 2026 09:14:07 +0900 Subject: [PATCH] fix: Handle unhashable BooleanField representation values --- rest_framework/fields.py | 13 +++++---- tests/test_fields.py | 59 ++++++++++++++++++++++------------------ 2 files changed, 39 insertions(+), 33 deletions(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 8dd4befdca..9eb2a50a8b 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -708,12 +708,13 @@ def to_internal_value(self, data): self.fail("invalid", input=data) def to_representation(self, value): - if self._lower_if_str(value) in self.TRUE_VALUES: - return True - elif self._lower_if_str(value) in self.FALSE_VALUES: - return False - if self._lower_if_str(value) in self.NULL_VALUES and self.allow_null: - return None + with contextlib.suppress(TypeError): + if self._lower_if_str(value) in self.TRUE_VALUES: + return True + elif self._lower_if_str(value) in self.FALSE_VALUES: + return False + if self._lower_if_str(value) in self.NULL_VALUES and self.allow_null: + return None return bool(value) diff --git a/tests/test_fields.py b/tests/test_fields.py index 89abc51365..869219a588 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -774,33 +774,38 @@ class TestBooleanField(FieldValues): 'foo': ['Must be a valid boolean.'], None: ['This field may not be null.'] } - outputs = { - 'True': True, - 'TRUE': True, - 'tRuE': True, - 't': True, - 'T': True, - 'true': True, - 'on': True, - 'ON': True, - 'oN': True, - 'False': False, - 'FALSE': False, - 'fALse': False, - 'f': False, - 'F': False, - 'false': False, - 'off': False, - 'OFF': False, - 'oFf': False, - '1': True, - '0': False, - 1: True, - 0: False, - True: True, - False: False, - 'other': True - } + outputs = [ + ('True', True), + ('TRUE', True), + ('tRuE', True), + ('t', True), + ('T', True), + ('true', True), + ('on', True), + ('ON', True), + ('oN', True), + ('False', False), + ('FALSE', False), + ('fALse', False), + ('f', False), + ('F', False), + ('false', False), + ('off', False), + ('OFF', False), + ('oFf', False), + ('1', True), + ('0', False), + (1, True), + (0, False), + (True, True), + (False, False), + ('other', True), + ([], False), + ({}, False), + (set(), False), + ([1], True), + ({'example': 'value'}, True), + ] field = serializers.BooleanField() def test_disallow_unhashable_collection_types(self):