From c28daf228948a04d15f30e5861a659eb8171f73f Mon Sep 17 00:00:00 2001 From: Jacob Kaplan-Moss Date: Thu, 1 Dec 2005 03:06:30 +0000 Subject: [PATCH] Fixed #757: manually set AutoField values are now respected; also added unit test to verify the correct behavior. Thanks, cygnus. git-svn-id: http://code.djangoproject.com/svn/django/trunk@1511 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- AUTHORS | 1 - django/core/meta/__init__.py | 8 ++++++-- tests/testapp/models/basic.py | 8 ++++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/AUTHORS b/AUTHORS index 294a91ac11..c13223e91c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -87,7 +87,6 @@ answer newbie questions, and generally made Django that much better: wojtek ye7cakf02@sneakemail.com - A big THANK YOU goes to: Rob Curley and Ralph Gage for letting us open-source Django. diff --git a/django/core/meta/__init__.py b/django/core/meta/__init__.py index 39ba4bc434..0af7fe51f1 100644 --- a/django/core/meta/__init__.py +++ b/django/core/meta/__init__.py @@ -1009,8 +1009,12 @@ def method_save(opts, self): record_exists = False if not pk_set or not record_exists: field_names = [db.db.quote_name(f.column) for f in opts.fields if not isinstance(f, AutoField)] - placeholders = ['%s'] * len(field_names) db_values = [f.get_db_prep_save(f.pre_save(getattr(self, f.attname), True)) for f in opts.fields if not isinstance(f, AutoField)] + # If the PK has been manually set we must respect that + if pk_set: + field_names += [f.column for f in opts.fields if isinstance(f, AutoField)] + db_values += [f.get_db_prep_save(f.pre_save(getattr(self, f.column), True)) for f in opts.fields if isinstance(f, AutoField)] + placeholders = ['%s'] * len(field_names) if opts.order_with_respect_to: field_names.append(db.db.quote_name('_order')) # TODO: This assumes the database supports subqueries. @@ -1020,7 +1024,7 @@ def method_save(opts, self): cursor.execute("INSERT INTO %s (%s) VALUES (%s)" % \ (db.db.quote_name(opts.db_table), ','.join(field_names), ','.join(placeholders)), db_values) - if opts.has_auto_field: + if opts.has_auto_field and not pk_set: setattr(self, opts.pk.attname, db.get_last_insert_id(cursor, opts.db_table, opts.pk.column)) db.db.commit() # Run any post-save hooks. diff --git a/tests/testapp/models/basic.py b/tests/testapp/models/basic.py index ad2a8cb862..80c264db86 100644 --- a/tests/testapp/models/basic.py +++ b/tests/testapp/models/basic.py @@ -157,6 +157,14 @@ datetime.datetime(2005, 7, 31, 12, 30, 45) >>> a8.save() >>> a8.id 8L + +# You can manually specify the primary key when creating a new objet +>>> a101 = articles.Article(id=101, headline='Article 101', pub_date=datetime(2005, 7, 31, 12, 30, 45)) +>>> a101.save() +>>> a101 = articles.get_object(pk=101) +>>> a101.headline +'Article 101' + """ from django.conf import settings