From 81e05a418dc6f347d9627373288e773c477a9fe0 Mon Sep 17 00:00:00 2001
From: Andrew Godwin <andrew@aeracode.org>
Date: Sat, 8 Jan 2011 13:27:30 +0000
Subject: [PATCH] Fixed #9029 -- Allow use of fieldname_id with get_or_create.
 Thanks to aaron and mrmachine.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@15156 bcc190cf-cafb-0310-a4f2-bffc1f526a37
---
 django/db/models/query.py                            |  8 ++++++--
 tests/regressiontests/get_or_create_regress/tests.py | 11 ++++++++++-
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/django/db/models/query.py b/django/db/models/query.py
index 2323c7d744..5395af2331 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -369,9 +369,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])
@@ -384,7 +388,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
 
diff --git a/tests/regressiontests/get_or_create_regress/tests.py b/tests/regressiontests/get_or_create_regress/tests.py
index 87057dab3f..e825fccc4b 100644
--- a/tests/regressiontests/get_or_create_regress/tests.py
+++ b/tests/regressiontests/get_or_create_regress/tests.py
@@ -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)