Fixed #15076 -- Quoted ForeignKey target class names in inspectdb when class is defined below.
Thanks saschwarz for the report, jeff@deserettechnology.com for the initial patch and Ramiro Morales for the review. git-svn-id: http://code.djangoproject.com/svn/django/trunk@17942 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
c34d069a75
commit
ddc5d59c6a
|
@ -41,8 +41,10 @@ class Command(NoArgsCommand):
|
||||||
yield ''
|
yield ''
|
||||||
yield 'from %s import models' % self.db_module
|
yield 'from %s import models' % self.db_module
|
||||||
yield ''
|
yield ''
|
||||||
|
known_models = []
|
||||||
for table_name in connection.introspection.get_table_list(cursor):
|
for table_name in connection.introspection.get_table_list(cursor):
|
||||||
yield 'class %s(models.Model):' % table2model(table_name)
|
yield 'class %s(models.Model):' % table2model(table_name)
|
||||||
|
known_models.append(table2model(table_name))
|
||||||
try:
|
try:
|
||||||
relations = connection.introspection.get_relations(cursor, table_name)
|
relations = connection.introspection.get_relations(cursor, table_name)
|
||||||
except NotImplementedError:
|
except NotImplementedError:
|
||||||
|
@ -83,7 +85,12 @@ class Command(NoArgsCommand):
|
||||||
|
|
||||||
if i in relations:
|
if i in relations:
|
||||||
rel_to = relations[i][1] == table_name and "'self'" or table2model(relations[i][1])
|
rel_to = relations[i][1] == table_name and "'self'" or table2model(relations[i][1])
|
||||||
|
|
||||||
|
if rel_to in known_models:
|
||||||
field_type = 'ForeignKey(%s' % rel_to
|
field_type = 'ForeignKey(%s' % rel_to
|
||||||
|
else:
|
||||||
|
field_type = "ForeignKey('%s'" % rel_to
|
||||||
|
|
||||||
if att_name.endswith('_id'):
|
if att_name.endswith('_id'):
|
||||||
att_name = att_name[:-3]
|
att_name = att_name[:-3]
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -12,7 +12,8 @@ class InspectDBTestCase(TestCase):
|
||||||
call_command('inspectdb', stdout=out)
|
call_command('inspectdb', stdout=out)
|
||||||
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())
|
# As InspectdbPeople model is defined after InspectdbMessage, it should be quoted
|
||||||
|
self.assertIn("from_field = models.ForeignKey('InspectdbPeople')", out.getvalue())
|
||||||
self.assertIn("people_pk = models.ForeignKey(InspectdbPeople, primary_key=True)",
|
self.assertIn("people_pk = models.ForeignKey(InspectdbPeople, primary_key=True)",
|
||||||
out.getvalue())
|
out.getvalue())
|
||||||
self.assertIn("people_unique = models.ForeignKey(InspectdbPeople, unique=True)",
|
self.assertIn("people_unique = models.ForeignKey(InspectdbPeople, unique=True)",
|
||||||
|
|
Loading…
Reference in New Issue