From 20ff296cb15a53b8b9517a834688e57749b43e21 Mon Sep 17 00:00:00 2001 From: Cole Maclean Date: Thu, 4 Jun 2015 14:42:26 +0100 Subject: [PATCH] Fixed #24859 -- Made QuerySet.get() with UUIDField raise TypeError on bad value. For consistency with AutoField. --- django/db/models/fields/__init__.py | 18 +++++++++++------- tests/model_fields/test_uuid.py | 7 +++++++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index b87af73994..568c66f4ac 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -2380,13 +2380,17 @@ class UUIDField(Field): return "UUIDField" def get_db_prep_value(self, value, connection, prepared=False): - if isinstance(value, six.string_types): - value = uuid.UUID(value) - if isinstance(value, uuid.UUID): - if connection.features.has_native_uuid_field: - return value - return value.hex - return value + if value is None: + return None + if not isinstance(value, uuid.UUID): + try: + value = uuid.UUID(value) + except AttributeError: + raise TypeError(self.error_messages['invalid'] % {'value': value}) + + if connection.features.has_native_uuid_field: + return value + return value.hex def to_python(self, value): if value and not isinstance(value, uuid.UUID): diff --git a/tests/model_fields/test_uuid.py b/tests/model_fields/test_uuid.py index e72a6bce56..bef1d54a74 100644 --- a/tests/model_fields/test_uuid.py +++ b/tests/model_fields/test_uuid.py @@ -37,6 +37,13 @@ class TestSaveLoad(TestCase): loaded = NullableUUIDModel.objects.get() self.assertEqual(loaded.field, None) + def test_pk_validated(self): + with self.assertRaisesMessage(TypeError, 'is not a valid UUID'): + PrimaryKeyUUIDModel.objects.get(pk={}) + + with self.assertRaisesMessage(TypeError, 'is not a valid UUID'): + PrimaryKeyUUIDModel.objects.get(pk=[]) + def test_wrong_value(self): self.assertRaisesMessage( ValueError, 'badly formed hexadecimal UUID string',