Commit 008f333b authored by Carl Meyer's avatar Carl Meyer
Browse files

Fixed pk uniqueness validation for new objects created outside of a ModelForm....

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.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@14613 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 38ba3775
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -265,7 +265,7 @@ class ModelState(object):
        # 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
+4 −0
Original line number Diff line number Diff line
@@ -284,6 +284,8 @@ class QuerySet(object):

                # 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 @@ def get_cached_row(klass, row, index_start, using, max_depth=0, cur_depth=0,
    # 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 @@ class RawQuerySet(object):
            setattr(instance, field, value)

        instance._state.db = self.query.using
        instance._state.adding = False

        return instance

+0 −2
Original line number Diff line number Diff line
@@ -254,10 +254,8 @@ class BaseModelForm(BaseForm):
            # 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:
+2 −0
Original line number Diff line number Diff line
@@ -58,6 +58,8 @@ class BrokenUnicodeMethod(models.Model):
        # 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
+13 −3
Original line number Diff line number Diff line
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.
@@ -14,3 +17,10 @@ class RelatedModelOrderedLookupTest(TestCase):

    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)