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
This commit is contained in:
parent
d02ba7f4ee
commit
ad8ebb7006
|
@ -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.')
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue