Fixed #33187 -- Made inspectdb handle ForeignKey.to_field attribute.
This commit is contained in:
parent
dab48b7482
commit
aaf9b55858
|
@ -116,13 +116,17 @@ class Command(BaseCommand):
|
||||||
extra_params['unique'] = True
|
extra_params['unique'] = True
|
||||||
|
|
||||||
if is_relation:
|
if is_relation:
|
||||||
|
ref_db_column, ref_db_table = relations[column_name]
|
||||||
if extra_params.pop('unique', False) or extra_params.get('primary_key'):
|
if extra_params.pop('unique', False) or extra_params.get('primary_key'):
|
||||||
rel_type = 'OneToOneField'
|
rel_type = 'OneToOneField'
|
||||||
else:
|
else:
|
||||||
rel_type = 'ForeignKey'
|
rel_type = 'ForeignKey'
|
||||||
|
ref_pk_column = connection.introspection.get_primary_key_column(cursor, ref_db_table)
|
||||||
|
if ref_pk_column and ref_pk_column != ref_db_column:
|
||||||
|
extra_params['to_field'] = ref_db_column
|
||||||
rel_to = (
|
rel_to = (
|
||||||
"self" if relations[column_name][1] == table_name
|
'self' if ref_db_table == table_name
|
||||||
else table2model(relations[column_name][1])
|
else table2model(ref_db_table)
|
||||||
)
|
)
|
||||||
if rel_to in known_models:
|
if rel_to in known_models:
|
||||||
field_type = '%s(%s' % (rel_type, rel_to)
|
field_type = '%s(%s' % (rel_type, rel_to)
|
||||||
|
|
|
@ -21,6 +21,12 @@ class PeopleMoreData(models.Model):
|
||||||
license = models.CharField(max_length=255)
|
license = models.CharField(max_length=255)
|
||||||
|
|
||||||
|
|
||||||
|
class ForeignKeyToField(models.Model):
|
||||||
|
to_field_fk = models.ForeignKey(
|
||||||
|
PeopleMoreData, models.CASCADE, to_field='people_unique',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class DigitsInColumnName(models.Model):
|
class DigitsInColumnName(models.Model):
|
||||||
all_digits = models.CharField(max_length=11, db_column='123')
|
all_digits = models.CharField(max_length=11, db_column='123')
|
||||||
leading_digit = models.CharField(max_length=11, db_column='4extra')
|
leading_digit = models.CharField(max_length=11, db_column='4extra')
|
||||||
|
|
|
@ -204,6 +204,16 @@ class InspectDBTestCase(TestCase):
|
||||||
output,
|
output,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@skipUnlessDBFeature('can_introspect_foreign_keys')
|
||||||
|
def test_foreign_key_to_field(self):
|
||||||
|
out = StringIO()
|
||||||
|
call_command('inspectdb', 'inspectdb_foreignkeytofield', stdout=out)
|
||||||
|
self.assertIn(
|
||||||
|
"to_field_fk = models.ForeignKey('InspectdbPeoplemoredata', "
|
||||||
|
"models.DO_NOTHING, to_field='people_unique_id')",
|
||||||
|
out.getvalue(),
|
||||||
|
)
|
||||||
|
|
||||||
def test_digits_column_name_introspection(self):
|
def test_digits_column_name_introspection(self):
|
||||||
"""Introspection of column names consist/start with digits (#16536/#17676)"""
|
"""Introspection of column names consist/start with digits (#16536/#17676)"""
|
||||||
char_field_type = connection.features.introspected_field_types['CharField']
|
char_field_type = connection.features.introspected_field_types['CharField']
|
||||||
|
|
Loading…
Reference in New Issue