From ad8ebb7006be7d93f1c6a29770dbca2752488a62 Mon Sep 17 00:00:00 2001 From: Julien Phalip Date: Sun, 5 Feb 2012 07:51:37 +0000 Subject: [PATCH] Fixed #8317 -- Corrected the inspectdb management command to properly set `primary_key=True` and `unique=True` on foreign keys. Thanks to bthomas for the report and patch, and to David Gouldin for the tests. git-svn-id: http://code.djangoproject.com/svn/django/trunk@17451 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/core/management/commands/inspectdb.py | 20 ++++++++++---------- tests/regressiontests/inspectdb/models.py | 9 +++++++++ tests/regressiontests/inspectdb/tests.py | 4 ++++ 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/django/core/management/commands/inspectdb.py b/django/core/management/commands/inspectdb.py index 76073c7d54..e81f399788 100644 --- a/django/core/management/commands/inspectdb.py +++ b/django/core/management/commands/inspectdb.py @@ -62,15 +62,22 @@ class Command(NoArgsCommand): if ' ' in att_name or '-' in att_name or keyword.iskeyword(att_name) or column_name != att_name: extra_params['db_column'] = column_name + # Add primary_key and unique, if necessary. + if column_name in indexes: + if indexes[column_name]['primary_key']: + extra_params['primary_key'] = True + elif indexes[column_name]['unique']: + extra_params['unique'] = True + # Modify the field name to make it Python-compatible. if ' ' in att_name: att_name = att_name.replace(' ', '_') comment_notes.append('Field renamed to remove spaces.') - + if '-' in att_name: att_name = att_name.replace('-', '_') comment_notes.append('Field renamed to remove dashes.') - + if column_name != att_name: comment_notes.append('Field name made lowercase.') @@ -88,15 +95,8 @@ class Command(NoArgsCommand): extra_params.update(field_params) comment_notes.extend(field_notes) - # Add primary_key and unique, if necessary. - if column_name in indexes: - if indexes[column_name]['primary_key']: - extra_params['primary_key'] = True - elif indexes[column_name]['unique']: - extra_params['unique'] = True - field_type += '(' - + if keyword.iskeyword(att_name): att_name += '_field' comment_notes.append('Field renamed because it was a Python reserved word.') diff --git a/tests/regressiontests/inspectdb/models.py b/tests/regressiontests/inspectdb/models.py index fc2548b441..fac47aa34f 100644 --- a/tests/regressiontests/inspectdb/models.py +++ b/tests/regressiontests/inspectdb/models.py @@ -6,3 +6,12 @@ class People(models.Model): class Message(models.Model): from_field = models.ForeignKey(People, db_column='from_id') + +class PeopleData(models.Model): + people_pk = models.ForeignKey(People, primary_key=True) + ssn = models.CharField(max_length=11) + +class PeopleMoreData(models.Model): + people_unique = models.ForeignKey(People, unique=True) + license = models.CharField(max_length=255) + diff --git a/tests/regressiontests/inspectdb/tests.py b/tests/regressiontests/inspectdb/tests.py index 683e6e9cf7..e2eced576d 100644 --- a/tests/regressiontests/inspectdb/tests.py +++ b/tests/regressiontests/inspectdb/tests.py @@ -13,4 +13,8 @@ class InspectDBTestCase(TestCase): error_message = "inspectdb generated an attribute name which is a python keyword" self.assertNotIn("from = models.ForeignKey(InspectdbPeople)", out.getvalue(), msg=error_message) self.assertIn("from_field = models.ForeignKey(InspectdbPeople)", out.getvalue()) + self.assertIn("people_pk = models.ForeignKey(InspectdbPeople, primary_key=True)", + out.getvalue()) + self.assertIn("people_unique = models.ForeignKey(InspectdbPeople, unique=True)", + out.getvalue()) out.close()