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:
|
if ' ' in att_name or '-' in att_name or keyword.iskeyword(att_name) or column_name != att_name:
|
||||||
extra_params['db_column'] = column_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.
|
# Modify the field name to make it Python-compatible.
|
||||||
if ' ' in att_name:
|
if ' ' in att_name:
|
||||||
att_name = att_name.replace(' ', '_')
|
att_name = att_name.replace(' ', '_')
|
||||||
comment_notes.append('Field renamed to remove spaces.')
|
comment_notes.append('Field renamed to remove spaces.')
|
||||||
|
|
||||||
if '-' in att_name:
|
if '-' in att_name:
|
||||||
att_name = att_name.replace('-', '_')
|
att_name = att_name.replace('-', '_')
|
||||||
comment_notes.append('Field renamed to remove dashes.')
|
comment_notes.append('Field renamed to remove dashes.')
|
||||||
|
|
||||||
if column_name != att_name:
|
if column_name != att_name:
|
||||||
comment_notes.append('Field name made lowercase.')
|
comment_notes.append('Field name made lowercase.')
|
||||||
|
|
||||||
|
@ -88,15 +95,8 @@ class Command(NoArgsCommand):
|
||||||
extra_params.update(field_params)
|
extra_params.update(field_params)
|
||||||
comment_notes.extend(field_notes)
|
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 += '('
|
field_type += '('
|
||||||
|
|
||||||
if keyword.iskeyword(att_name):
|
if keyword.iskeyword(att_name):
|
||||||
att_name += '_field'
|
att_name += '_field'
|
||||||
comment_notes.append('Field renamed because it was a Python reserved word.')
|
comment_notes.append('Field renamed because it was a Python reserved word.')
|
||||||
|
|
|
@ -6,3 +6,12 @@ class People(models.Model):
|
||||||
|
|
||||||
class Message(models.Model):
|
class Message(models.Model):
|
||||||
from_field = models.ForeignKey(People, db_column='from_id')
|
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"
|
error_message = "inspectdb generated an attribute name which is a python keyword"
|
||||||
self.assertNotIn("from = models.ForeignKey(InspectdbPeople)", out.getvalue(), msg=error_message)
|
self.assertNotIn("from = models.ForeignKey(InspectdbPeople)", out.getvalue(), msg=error_message)
|
||||||
self.assertIn("from_field = models.ForeignKey(InspectdbPeople)", out.getvalue())
|
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()
|
out.close()
|
||||||
|
|
Loading…
Reference in New Issue