Fixed #29869 -- Made UUIDField.to_python() convert integers.

This commit is contained in:
Sanyam Khurana 2018-10-25 03:13:41 +05:30 committed by Tim Graham
parent fd49701ab9
commit 83c7096f2a
2 changed files with 18 additions and 1 deletions

View File

@ -2319,8 +2319,9 @@ class UUIDField(Field):
def to_python(self, value): def to_python(self, value):
if value is not None and not isinstance(value, uuid.UUID): if value is not None and not isinstance(value, uuid.UUID):
input_form = 'int' if isinstance(value, int) else 'hex'
try: try:
return uuid.UUID(value) return uuid.UUID(**{input_form: value})
except (AttributeError, ValueError): except (AttributeError, ValueError):
raise exceptions.ValidationError( raise exceptions.ValidationError(
self.error_messages['invalid'], self.error_messages['invalid'],

View File

@ -64,6 +64,22 @@ class TestMethods(SimpleTestCase):
def test_to_python(self): def test_to_python(self):
self.assertIsNone(models.UUIDField().to_python(None)) self.assertIsNone(models.UUIDField().to_python(None))
def test_to_python_int_values(self):
self.assertEqual(
models.UUIDField().to_python(0),
uuid.UUID('00000000-0000-0000-0000-000000000000')
)
# Works for integers less than 128 bits.
self.assertEqual(
models.UUIDField().to_python((2 ** 128) - 1),
uuid.UUID('ffffffff-ffff-ffff-ffff-ffffffffffff')
)
def test_to_python_int_too_large(self):
# Fails for integers larger than 128 bits.
with self.assertRaises(exceptions.ValidationError):
models.UUIDField().to_python(2 ** 128)
class TestQuerying(TestCase): class TestQuerying(TestCase):
def setUp(self): def setUp(self):