Commit c47fa3b4 authored by Aymeric Augustin's avatar Aymeric Augustin
Browse files

Fixed #19676 -- Supported 'self' foreign keys in inspectdb.

Thanks Georgy Kutsurua for the report and Simon Charette for the patch.
parent f46d7314
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -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:
+1 −0
Original line number Diff line number Diff line
@@ -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')
+2 −0
Original line number Diff line number Diff line
@@ -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')",