Author: carljm
Date: 2010-11-18 17:29:58 -0600 (Thu, 18 Nov 2010)
New Revision: 14613

Modified:
   django/trunk/django/db/models/base.py
   django/trunk/django/db/models/query.py
   django/trunk/django/forms/models.py
   django/trunk/tests/regressiontests/model_regress/models.py
   django/trunk/tests/regressiontests/model_regress/tests.py
Log:
Fixed pk uniqueness validation for new objects created outside of a ModelForm. 
Also removed need for ModelForm to poke at Model._state.adding, keeping it an 
internal ORM concern.

Modified: django/trunk/django/db/models/base.py
===================================================================
--- django/trunk/django/db/models/base.py       2010-11-18 22:43:46 UTC (rev 
14612)
+++ django/trunk/django/db/models/base.py       2010-11-18 23:29:58 UTC (rev 
14613)
@@ -265,7 +265,7 @@
         # If true, uniqueness validation checks will consider this a new, 
as-yet-unsaved object.
         # Necessary for correct validation of new instances of objects with 
explicit (non-auto) PKs.
         # This impacts validation only; it has no effect on the actual save.
-        self.adding = False
+        self.adding = True
 
 class Model(object):
     __metaclass__ = ModelBase

Modified: django/trunk/django/db/models/query.py
===================================================================
--- django/trunk/django/db/models/query.py      2010-11-18 22:43:46 UTC (rev 
14612)
+++ django/trunk/django/db/models/query.py      2010-11-18 23:29:58 UTC (rev 
14613)
@@ -284,6 +284,8 @@
 
                 # Store the source database of the object
                 obj._state.db = self.db
+                # This object came from the database; it's not being added.
+                obj._state.adding = False
 
             for i, k in enumerate(extra_select):
                 setattr(obj, k, row[i])
@@ -1204,6 +1206,7 @@
     # If an object was retrieved, set the database state.
     if obj:
         obj._state.db = using
+        obj._state.adding = False
 
     index_end = index_start + field_count + offset
     # Iterate over each related object, populating any
@@ -1387,6 +1390,7 @@
             setattr(instance, field, value)
 
         instance._state.db = self.query.using
+        instance._state.adding = False
 
         return instance
 

Modified: django/trunk/django/forms/models.py
===================================================================
--- django/trunk/django/forms/models.py 2010-11-18 22:43:46 UTC (rev 14612)
+++ django/trunk/django/forms/models.py 2010-11-18 23:29:58 UTC (rev 14613)
@@ -254,10 +254,8 @@
             # if we didn't get an instance, instantiate a new one
             self.instance = opts.model()
             object_data = {}
-            self.instance._state.adding = True
         else:
             self.instance = instance
-            self.instance._state.adding = False
             object_data = model_to_dict(instance, opts.fields, opts.exclude)
         # if initial was provided, it should override the values from instance
         if initial is not None:

Modified: django/trunk/tests/regressiontests/model_regress/models.py
===================================================================
--- django/trunk/tests/regressiontests/model_regress/models.py  2010-11-18 
22:43:46 UTC (rev 14612)
+++ django/trunk/tests/regressiontests/model_regress/models.py  2010-11-18 
23:29:58 UTC (rev 14613)
@@ -58,6 +58,8 @@
         # object).
         return 'Názov: %s' % self.name
 
+class NonAutoPK(models.Model):
+    name = models.CharField(max_length=10, primary_key=True)
 
 __test__ = {'API_TESTS': """
 (NOTE: Part of the regression test here is merely parsing the model

Modified: django/trunk/tests/regressiontests/model_regress/tests.py
===================================================================
--- django/trunk/tests/regressiontests/model_regress/tests.py   2010-11-18 
22:43:46 UTC (rev 14612)
+++ django/trunk/tests/regressiontests/model_regress/tests.py   2010-11-18 
23:29:58 UTC (rev 14613)
@@ -1,16 +1,26 @@
-from models import Worker
+from django.core.exceptions import ValidationError
 from django.test import TestCase
 
+from models import Worker, NonAutoPK
+
+
 class RelatedModelOrderedLookupTest(TestCase):
     """
     Regression test for #10153: foreign key __gte and __lte lookups.
     """
-    
+
     # The bug is that the following queries would raise:
     # "TypeError: Related Field has invalid lookup: gte"
-    
+
     def test_related_gte_lookup(self):
         Worker.objects.filter(department__gte=0)
 
     def test_related_lte_lookup(self):
         Worker.objects.filter(department__lte=0)
+
+
+class ModelValidationTest(TestCase):
+    def test_pk_validation(self):
+        one = NonAutoPK.objects.create(name="one")
+        again = NonAutoPK(name="one")
+        self.assertRaises(ValidationError, again.validate_unique)

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to