diff --git a/django/db/backends/base/introspection.py b/django/db/backends/base/introspection.py index fb362eed1e..29807dfe98 100644 --- a/django/db/backends/base/introspection.py +++ b/django/db/backends/base/introspection.py @@ -54,6 +54,16 @@ class BaseDatabaseIntrospection: """ raise NotImplementedError('subclasses of BaseDatabaseIntrospection may require a get_table_list() method') + def get_migratable_models(self): + from django.apps import apps + from django.db import router + return ( + model + for app_config in apps.get_app_configs() + for model in router.get_migratable_models(app_config, self.connection.alias) + if model._meta.can_migrate(self.connection) + ) + def django_table_names(self, only_existing=False, include_views=True): """ Return a list of all table names that have associated Django models and @@ -61,18 +71,15 @@ class BaseDatabaseIntrospection: If only_existing is True, include only the tables in the database. """ - from django.apps import apps - from django.db import router tables = set() - for app_config in apps.get_app_configs(): - for model in router.get_migratable_models(app_config, self.connection.alias): - if not model._meta.managed: - continue - tables.add(model._meta.db_table) - tables.update( - f.m2m_db_table() for f in model._meta.local_many_to_many - if f.remote_field.through._meta.managed - ) + for model in self.get_migratable_models(): + if not model._meta.managed: + continue + tables.add(model._meta.db_table) + tables.update( + f.m2m_db_table() for f in model._meta.local_many_to_many + if f.remote_field.through._meta.managed + ) tables = list(tables) if only_existing: existing_tables = set(self.table_names(include_views=include_views)) @@ -88,14 +95,9 @@ class BaseDatabaseIntrospection: Return a set of all models represented by the provided list of table names. """ - from django.apps import apps - from django.db import router - all_models = [] - for app_config in apps.get_app_configs(): - all_models.extend(router.get_migratable_models(app_config, self.connection.alias)) tables = set(map(self.identifier_converter, tables)) return { - m for m in all_models + m for m in self.get_migratable_models() if self.identifier_converter(m._meta.db_table) in tables } @@ -104,24 +106,20 @@ class BaseDatabaseIntrospection: Return a list of information about all DB sequences for all models in all apps. """ - from django.apps import apps - from django.db import router - sequence_list = [] with self.connection.cursor() as cursor: - for app_config in apps.get_app_configs(): - for model in router.get_migratable_models(app_config, self.connection.alias): - if not model._meta.managed: - continue - if model._meta.swapped: - continue - sequence_list.extend(self.get_sequences(cursor, model._meta.db_table, model._meta.local_fields)) - for f in model._meta.local_many_to_many: - # If this is an m2m using an intermediate table, - # we don't need to reset the sequence. - if f.remote_field.through._meta.auto_created: - sequence = self.get_sequences(cursor, f.m2m_db_table()) - sequence_list.extend(sequence or [{'table': f.m2m_db_table(), 'column': None}]) + for model in self.get_migratable_models(): + if not model._meta.managed: + continue + if model._meta.swapped: + continue + sequence_list.extend(self.get_sequences(cursor, model._meta.db_table, model._meta.local_fields)) + for f in model._meta.local_many_to_many: + # If this is an m2m using an intermediate table, + # we don't need to reset the sequence. + if f.remote_field.through._meta.auto_created: + sequence = self.get_sequences(cursor, f.m2m_db_table()) + sequence_list.extend(sequence or [{'table': f.m2m_db_table(), 'column': None}]) return sequence_list def get_sequences(self, cursor, table_name, table_fields=()):