From c89d80e2cc9bf1f401aa3af4047bdc6f3dc5bfa4 Mon Sep 17 00:00:00 2001 From: Michael Manfre Date: Thu, 12 Sep 2013 10:03:29 -0400 Subject: [PATCH] Fixed #21097 - Added DatabaseFeature.can_introspect_autofield --- django/core/management/commands/inspectdb.py | 7 +++++-- django/db/backends/__init__.py | 3 +++ tests/inspectdb/tests.py | 3 ++- tests/introspection/tests.py | 5 +++-- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/django/core/management/commands/inspectdb.py b/django/core/management/commands/inspectdb.py index b4c116acab..89549dc3c1 100644 --- a/django/core/management/commands/inspectdb.py +++ b/django/core/management/commands/inspectdb.py @@ -104,8 +104,11 @@ class Command(NoArgsCommand): # Don't output 'id = meta.AutoField(primary_key=True)', because # that's assumed if it doesn't exist. - if att_name == 'id' and field_type == 'AutoField(' and extra_params == {'primary_key': True}: - continue + if att_name == 'id' and extra_params == {'primary_key': True}: + if field_type == 'AutoField(': + continue + elif field_type == 'IntegerField(' and not connection.features.can_introspect_autofield: + comment_notes.append('AutoField?') # Add 'null' and 'blank', if the 'null_ok' flag was present in the # table description. diff --git a/django/db/backends/__init__.py b/django/db/backends/__init__.py index d22fea5ec2..44024c5349 100644 --- a/django/db/backends/__init__.py +++ b/django/db/backends/__init__.py @@ -627,6 +627,9 @@ class BaseDatabaseFeatures(object): # which can't do it for MyISAM tables can_introspect_foreign_keys = True + # Can the backend introspect an AutoField, instead of an IntegerField? + can_introspect_autofield = False + # Support for the DISTINCT ON clause can_distinct_on_fields = False diff --git a/tests/inspectdb/tests.py b/tests/inspectdb/tests.py index d6f6e478e4..302db29e5d 100644 --- a/tests/inspectdb/tests.py +++ b/tests/inspectdb/tests.py @@ -42,7 +42,8 @@ class InspectDBTestCase(TestCase): out_def = re.search(r'^\s*%s = (models.*)$' % name, output, re.MULTILINE).groups()[0] self.assertEqual(definition, out_def) - assertFieldType('id', "models.IntegerField(primary_key=True)") + if not connection.features.can_introspect_autofield: + assertFieldType('id', "models.IntegerField(primary_key=True) # AutoField?") assertFieldType('big_int_field', "models.BigIntegerField()") if connection.vendor == 'mysql': # No native boolean type on MySQL diff --git a/tests/introspection/tests.py b/tests/introspection/tests.py index 6f38439945..8ec3d39903 100644 --- a/tests/introspection/tests.py +++ b/tests/introspection/tests.py @@ -66,8 +66,9 @@ class IntrospectionTests(TestCase): # field type on MySQL self.assertEqual( [datatype(r[1], r) for r in desc], - ['IntegerField', 'CharField', 'CharField', 'CharField', - 'BigIntegerField', 'BinaryField' if connection.vendor != 'mysql' else 'TextField'] + ['AutoField' if connection.features.can_introspect_autofield else 'IntegerField', + 'CharField', 'CharField', 'CharField', 'BigIntegerField', + 'BinaryField' if connection.vendor != 'mysql' else 'TextField'] ) # The following test fails on Oracle due to #17202 (can't correctly