summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Charette <simon.charette@zapier.com>2019-08-11 21:46:23 -0400
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2019-08-12 06:33:46 +0200
commit2fb872e56f064361c2cd4674c0f23cd419994d82 (patch)
tree8289aa2c50d3c268cf6558003e2e9c0046e3c38e
parent73ac9e3f04c4a1a6b1add05c207d11c8ff461b7d (diff)
Refs #23879 -- Made introspection respect required_db_features.
-rw-r--r--django/db/backends/base/introspection.py64
1 files changed, 31 insertions, 33 deletions
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=()):