summaryrefslogtreecommitdiff
path: root/django/db/backends/base/schema.py
diff options
context:
space:
mode:
Diffstat (limited to 'django/db/backends/base/schema.py')
-rw-r--r--django/db/backends/base/schema.py45
1 files changed, 31 insertions, 14 deletions
diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py
index 113d1b7f67..0522abcaad 100644
--- a/django/db/backends/base/schema.py
+++ b/django/db/backends/base/schema.py
@@ -77,6 +77,7 @@ class BaseDatabaseSchemaEditor:
"REFERENCES %(to_table)s (%(to_column)s)%(deferrable)s"
)
sql_create_inline_fk = None
+ sql_create_column_inline_fk = None
sql_delete_fk = sql_delete_constraint
sql_create_index = "CREATE INDEX %(name)s ON %(table)s (%(columns)s)%(extra)s%(condition)s"
@@ -433,6 +434,22 @@ class BaseDatabaseSchemaEditor:
db_params = field.db_parameters(connection=self.connection)
if db_params['check']:
definition += " " + self.sql_check_constraint % db_params
+ if field.remote_field and self.connection.features.supports_foreign_keys and field.db_constraint:
+ constraint_suffix = '_fk_%(to_table)s_%(to_column)s'
+ # Add FK constraint inline, if supported.
+ if self.sql_create_column_inline_fk:
+ to_table = field.remote_field.model._meta.db_table
+ to_column = field.remote_field.model._meta.get_field(field.remote_field.field_name).column
+ definition += " " + self.sql_create_column_inline_fk % {
+ 'name': self._fk_constraint_name(model, field, constraint_suffix),
+ 'column': self.quote_name(field.column),
+ 'to_table': self.quote_name(to_table),
+ 'to_column': self.quote_name(to_column),
+ 'deferrable': self.connection.ops.deferrable_sql()
+ }
+ # Otherwise, add FK constraints later.
+ else:
+ self.deferred_sql.append(self._create_fk_sql(model, field, constraint_suffix))
# Build the SQL and run it
sql = self.sql_create_column % {
"table": self.quote_name(model._meta.db_table),
@@ -451,9 +468,6 @@ class BaseDatabaseSchemaEditor:
self.execute(sql, params)
# Add an index, if required
self.deferred_sql.extend(self._field_indexes_sql(model, field))
- # Add any FK constraints later
- if field.remote_field and self.connection.features.supports_foreign_keys and field.db_constraint:
- self.deferred_sql.append(self._create_fk_sql(model, field, "_fk_%(to_table)s_%(to_column)s"))
# Reset connection if required
if self.connection.features.connection_persists_old_columns:
self.connection.close()
@@ -984,18 +998,8 @@ class BaseDatabaseSchemaEditor:
}
def _create_fk_sql(self, model, field, suffix):
- def create_fk_name(*args, **kwargs):
- return self.quote_name(self._create_index_name(*args, **kwargs))
-
table = Table(model._meta.db_table, self.quote_name)
- name = ForeignKeyName(
- model._meta.db_table,
- [field.column],
- split_identifier(field.target_field.model._meta.db_table)[1],
- [field.target_field.column],
- suffix,
- create_fk_name,
- )
+ name = self._fk_constraint_name(model, field, suffix)
column = Columns(model._meta.db_table, [field.column], self.quote_name)
to_table = Table(field.target_field.model._meta.db_table, self.quote_name)
to_column = Columns(field.target_field.model._meta.db_table, [field.target_field.column], self.quote_name)
@@ -1010,6 +1014,19 @@ class BaseDatabaseSchemaEditor:
deferrable=deferrable,
)
+ def _fk_constraint_name(self, model, field, suffix):
+ def create_fk_name(*args, **kwargs):
+ return self.quote_name(self._create_index_name(*args, **kwargs))
+
+ return ForeignKeyName(
+ model._meta.db_table,
+ [field.column],
+ split_identifier(field.target_field.model._meta.db_table)[1],
+ [field.target_field.column],
+ suffix,
+ create_fk_name,
+ )
+
def _delete_fk_sql(self, model, name):
return self._delete_constraint_sql(self.sql_delete_fk, model, name)