From 695de8cc9145e139c2b22e05aa44f5ac04da6f85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Honza=20Kr=C3=A1l?= Date: Sun, 13 Dec 2009 21:39:46 +0000 Subject: [PATCH] [soc2009/model-validation] Fixed #12132: unneccessary unique_check for primary key when not adding model git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2009/model-validation@11856 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/models/base.py | 4 ++++ tests/modeltests/validation/test_unique.py | 27 +++++++++++++++++++++- tests/modeltests/validation/tests.py | 2 +- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/django/db/models/base.py b/django/db/models/base.py index a348cf6de7..04c802a04b 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -678,6 +678,10 @@ class Model(object): f = self._meta.get_field(field_name) lookup_value = getattr(self, f.attname) if f.null and lookup_value is None: + # no value, skip the lookup + continue + if f.primary_key and not getattr(self, '_adding', False): + # no need to check for unique primary key when editting continue lookup_kwargs[str(field_name)] = lookup_value diff --git a/tests/modeltests/validation/test_unique.py b/tests/modeltests/validation/test_unique.py index 98c9615927..2790d378c6 100644 --- a/tests/modeltests/validation/test_unique.py +++ b/tests/modeltests/validation/test_unique.py @@ -1,6 +1,9 @@ import unittest -from models import CustomPKModel, UniqueTogetherModel, UniqueFieldsModel, UniqueForDateModel +from django.conf import settings +from django.db import connection + +from models import CustomPKModel, UniqueTogetherModel, UniqueFieldsModel, UniqueForDateModel, ModelToValidate class GetUniqueCheckTests(unittest.TestCase): def test_unique_fields_get_collected(self): @@ -24,4 +27,26 @@ class GetUniqueCheckTests(unittest.TestCase): ) +class PerformUniqueChecksTest(unittest.TestCase): + def setUp(self): + self._old_debug, settings.DEBUG = settings.DEBUG, True + super(PerformUniqueChecksTest, self).setUp() + def tearDown(self): + settings.DEBUG = self._old_debug + super(PerformUniqueChecksTest, self).tearDown() + + def test_primary_key_unique_check_performed_when_adding(self): + "Check#12132" + l = len(connection.queries) + mtv = ModelToValidate(number=10, name='Some Name') + setattr(mtv, '_adding', True) + mtv.clean() + self.assertEqual(l+1, len(connection.queries)) + + def test_primary_key_unique_check_not_performed_when_not_adding(self): + "Check#12132" + l = len(connection.queries) + mtv = ModelToValidate(number=10, name='Some Name') + mtv.clean() + self.assertEqual(l, len(connection.queries)) diff --git a/tests/modeltests/validation/tests.py b/tests/modeltests/validation/tests.py index 25f9d0c005..656e9d8216 100644 --- a/tests/modeltests/validation/tests.py +++ b/tests/modeltests/validation/tests.py @@ -5,7 +5,7 @@ from modeltests.validation import ValidationTestCase from models import * from validators import TestModelsWithValidators -from test_unique import GetUniqueCheckTests +from test_unique import GetUniqueCheckTests, PerformUniqueChecksTest from test_custom_messages import CustomMessagesTest class BaseModelValidationTests(ValidationTestCase):