diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index e5dc5e9e8a9..c3da2d40491 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -2337,9 +2337,7 @@ class UUIDField(Field): return value.hex def to_python(self, value): - if value is None: - return None - if not isinstance(value, uuid.UUID): + if value is not None and not isinstance(value, uuid.UUID): try: return uuid.UUID(value) except (AttributeError, ValueError): diff --git a/tests/model_fields/test_uuid.py b/tests/model_fields/test_uuid.py index 5c87e4b0af8..bc1c8d5bc06 100644 --- a/tests/model_fields/test_uuid.py +++ b/tests/model_fields/test_uuid.py @@ -54,13 +54,16 @@ class TestSaveLoad(TestCase): UUIDModel.objects.create(field='not-a-uuid') -class TestMigrations(SimpleTestCase): +class TestMethods(SimpleTestCase): def test_deconstruct(self): field = models.UUIDField() name, path, args, kwargs = field.deconstruct() self.assertEqual(kwargs, {}) + def test_to_python(self): + self.assertIsNone(models.UUIDField().to_python(None)) + class TestQuerying(TestCase): def setUp(self): @@ -88,6 +91,10 @@ class TestSerialization(SimpleTestCase): '[{"fields": {"field": "550e8400-e29b-41d4-a716-446655440000"}, ' '"model": "model_fields.uuidmodel", "pk": null}]' ) + nullable_test_data = ( + '[{"fields": {"field": null}, ' + '"model": "model_fields.nullableuuidmodel", "pk": null}]' + ) def test_dumping(self): instance = UUIDModel(field=uuid.UUID('550e8400e29b41d4a716446655440000')) @@ -98,6 +105,10 @@ class TestSerialization(SimpleTestCase): instance = list(serializers.deserialize('json', self.test_data))[0].object self.assertEqual(instance.field, uuid.UUID('550e8400-e29b-41d4-a716-446655440000')) + def test_nullable_loading(self): + instance = list(serializers.deserialize('json', self.nullable_test_data))[0].object + self.assertIsNone(instance.field) + class TestValidation(SimpleTestCase): def test_invalid_uuid(self):