Commit 2b90267f authored by Andrew Godwin's avatar Andrew Godwin
Browse files

[1.2.X] Fixed #9029 -- Allow use of fieldname_id with get_or_create. Thanks to aaron and mrmachine.

Backport of [15156] from trunk

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@15157 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 6849c5f3
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -367,9 +367,13 @@ class QuerySet(object):
        assert kwargs, \
                'get_or_create() must be passed at least one keyword argument'
        defaults = kwargs.pop('defaults', {})
        lookup = kwargs.copy()
        for f in self.model._meta.fields:
            if f.column in lookup:
                lookup[f.name] = lookup.pop(f.column)
        try:
            self._for_write = True
            return self.get(**kwargs), False
            return self.get(**lookup), False
        except self.model.DoesNotExist:
            try:
                params = dict([(k, v) for k, v in kwargs.items() if '__' not in k])
@@ -382,7 +386,7 @@ class QuerySet(object):
            except IntegrityError, e:
                transaction.savepoint_rollback(sid, using=self.db)
                try:
                    return self.get(**kwargs), False
                    return self.get(**lookup), False
                except self.model.DoesNotExist:
                    raise e

+10 −1
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@ class GetOrCreateTests(TestCase):
        # Add an author to the book.
        ed, created = book.authors.get_or_create(name="Ed")
        self.assertTrue(created)
        # Book should have one author.
        # The book should have one author.
        self.assertEqual(book.authors.count(), 1)

        # Try get_or_create again, this time nothing should be created.
@@ -51,3 +51,12 @@ class GetOrCreateTests(TestCase):
        # Now Ed has two Books, Fred just one.
        self.assertEqual(ed.books.count(), 2)
        self.assertEqual(fred.books.count(), 1)

        # Use the publisher's primary key value instead of a model instance.
        _, created = ed.books.get_or_create(name='The Great Book of Ed', publisher_id=p.id)
        self.assertTrue(created)
        # Try get_or_create again, this time nothing should be created.
        _, created = ed.books.get_or_create(name='The Great Book of Ed', publisher_id=p.id)
        self.assertFalse(created)
        # The publisher should have three books.
        self.assertEqual(p.books.count(), 3)