Fixed #19676 -- Supported 'self' foreign keys in inspectdb.
Thanks Georgy Kutsurua for the report and Simon Charette for the patch.
This commit is contained in:
parent
f46d7314b5
commit
c47fa3b481
|
@ -6,7 +6,7 @@ from optparse import make_option
|
||||||
|
|
||||||
from django.core.management.base import NoArgsCommand, CommandError
|
from django.core.management.base import NoArgsCommand, CommandError
|
||||||
from django.db import connections, DEFAULT_DB_ALIAS
|
from django.db import connections, DEFAULT_DB_ALIAS
|
||||||
from django.utils import six
|
|
||||||
|
|
||||||
class Command(NoArgsCommand):
|
class Command(NoArgsCommand):
|
||||||
help = "Introspects the database tables in the given database and outputs a Django model module."
|
help = "Introspects the database tables in the given database and outputs a Django model module."
|
||||||
|
@ -34,7 +34,7 @@ class Command(NoArgsCommand):
|
||||||
table_name_filter = options.get('table_name_filter')
|
table_name_filter = options.get('table_name_filter')
|
||||||
|
|
||||||
table2model = lambda table_name: table_name.title().replace('_', '').replace(' ', '').replace('-', '')
|
table2model = lambda table_name: table_name.title().replace('_', '').replace(' ', '').replace('-', '')
|
||||||
strip_prefix = lambda s: s.startswith("u'") and s[1:] or s
|
strip_prefix = lambda s: s[1:] if s.startswith("u'") else s
|
||||||
|
|
||||||
cursor = connection.cursor()
|
cursor = connection.cursor()
|
||||||
yield "# This is an auto-generated Django model module."
|
yield "# This is an auto-generated Django model module."
|
||||||
|
@ -86,7 +86,7 @@ class Command(NoArgsCommand):
|
||||||
extra_params['unique'] = True
|
extra_params['unique'] = True
|
||||||
|
|
||||||
if is_relation:
|
if is_relation:
|
||||||
rel_to = relations[i][1] == table_name and "'self'" or table2model(relations[i][1])
|
rel_to = "self" if relations[i][1] == table_name else table2model(relations[i][1])
|
||||||
if rel_to in known_models:
|
if rel_to in known_models:
|
||||||
field_type = 'ForeignKey(%s' % rel_to
|
field_type = 'ForeignKey(%s' % rel_to
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -3,6 +3,7 @@ from django.db import models
|
||||||
|
|
||||||
class People(models.Model):
|
class People(models.Model):
|
||||||
name = models.CharField(max_length=255)
|
name = models.CharField(max_length=255)
|
||||||
|
parent = models.ForeignKey('self')
|
||||||
|
|
||||||
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')
|
||||||
|
|
|
@ -31,6 +31,8 @@ class InspectDBTestCase(TestCase):
|
||||||
stdout=out)
|
stdout=out)
|
||||||
output = out.getvalue()
|
output = out.getvalue()
|
||||||
error_message = "inspectdb generated an attribute name which is a python keyword"
|
error_message = "inspectdb generated an attribute name which is a python keyword"
|
||||||
|
# Recursive foreign keys should be set to 'self'
|
||||||
|
self.assertIn("parent = models.ForeignKey('self')", output)
|
||||||
self.assertNotIn("from = models.ForeignKey(InspectdbPeople)", output, msg=error_message)
|
self.assertNotIn("from = models.ForeignKey(InspectdbPeople)", output, msg=error_message)
|
||||||
# As InspectdbPeople model is defined after InspectdbMessage, it should be quoted
|
# As InspectdbPeople model is defined after InspectdbMessage, it should be quoted
|
||||||
self.assertIn("from_field = models.ForeignKey('InspectdbPeople', db_column='from_id')",
|
self.assertIn("from_field = models.ForeignKey('InspectdbPeople', db_column='from_id')",
|
||||||
|
|
Loading…
Reference in New Issue