From c47fa3b4814240bb47342a4446d40ea83bd3ed19 Mon Sep 17 00:00:00 2001 From: Aymeric Augustin Date: Mon, 28 Jan 2013 10:21:07 +0100 Subject: [PATCH] Fixed #19676 -- Supported 'self' foreign keys in inspectdb. Thanks Georgy Kutsurua for the report and Simon Charette for the patch. --- django/core/management/commands/inspectdb.py | 6 +++--- tests/regressiontests/inspectdb/models.py | 1 + tests/regressiontests/inspectdb/tests.py | 2 ++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/django/core/management/commands/inspectdb.py b/django/core/management/commands/inspectdb.py index 936d5e89ab..443312c66d 100644 --- a/django/core/management/commands/inspectdb.py +++ b/django/core/management/commands/inspectdb.py @@ -6,7 +6,7 @@ from optparse import make_option from django.core.management.base import NoArgsCommand, CommandError from django.db import connections, DEFAULT_DB_ALIAS -from django.utils import six + class Command(NoArgsCommand): 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') 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() yield "# This is an auto-generated Django model module." @@ -86,7 +86,7 @@ class Command(NoArgsCommand): extra_params['unique'] = True 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: field_type = 'ForeignKey(%s' % rel_to else: diff --git a/tests/regressiontests/inspectdb/models.py b/tests/regressiontests/inspectdb/models.py index 4a6621402f..a8adf862b1 100644 --- a/tests/regressiontests/inspectdb/models.py +++ b/tests/regressiontests/inspectdb/models.py @@ -3,6 +3,7 @@ from django.db import models class People(models.Model): name = models.CharField(max_length=255) + parent = models.ForeignKey('self') class Message(models.Model): from_field = models.ForeignKey(People, db_column='from_id') diff --git a/tests/regressiontests/inspectdb/tests.py b/tests/regressiontests/inspectdb/tests.py index 028d263337..f9cbbce5c4 100644 --- a/tests/regressiontests/inspectdb/tests.py +++ b/tests/regressiontests/inspectdb/tests.py @@ -31,6 +31,8 @@ class InspectDBTestCase(TestCase): stdout=out) output = out.getvalue() 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) # As InspectdbPeople model is defined after InspectdbMessage, it should be quoted self.assertIn("from_field = models.ForeignKey('InspectdbPeople', db_column='from_id')",