summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2017-06-27 21:15:15 +0200
committerGitHub <noreply@github.com>2017-06-27 21:15:15 +0200
commit3297dede7fce4b190f7b3bf0b0fc29a734151b61 (patch)
tree1f1c91a72990ccaa7908766a20a64186b2971bc0 /django
parent617505ca892fc84c7be1c224ebca2c27f93e8f50 (diff)
Fixed #28046 -- Added the db_tablespace parameter to class-based indexes.
Thanks Markus Holtermann and Tim Graham for reviews.
Diffstat (limited to 'django')
-rw-r--r--django/db/backends/base/schema.py19
-rw-r--r--django/db/models/indexes.py10
2 files changed, 16 insertions, 13 deletions
diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py
index c24e809570..ed5f2e869f 100644
--- a/django/db/backends/base/schema.py
+++ b/django/db/backends/base/schema.py
@@ -879,16 +879,15 @@ class BaseDatabaseSchemaEditor:
index_name = "D%s" % index_name[:-1]
return index_name
- def _get_index_tablespace_sql(self, model, fields):
- if len(fields) == 1 and fields[0].db_tablespace:
- tablespace_sql = self.connection.ops.tablespace_sql(fields[0].db_tablespace)
- elif model._meta.db_tablespace:
- tablespace_sql = self.connection.ops.tablespace_sql(model._meta.db_tablespace)
- else:
- tablespace_sql = ""
- if tablespace_sql:
- tablespace_sql = " " + tablespace_sql
- return tablespace_sql
+ def _get_index_tablespace_sql(self, model, fields, db_tablespace=None):
+ if db_tablespace is None:
+ if len(fields) == 1 and fields[0].db_tablespace:
+ db_tablespace = fields[0].db_tablespace
+ elif model._meta.db_tablespace:
+ db_tablespace = model._meta.db_tablespace
+ if db_tablespace is not None:
+ return ' ' + self.connection.ops.tablespace_sql(db_tablespace)
+ return ''
def _create_index_sql(self, model, fields, suffix="", sql=None):
"""
diff --git a/django/db/models/indexes.py b/django/db/models/indexes.py
index 4c1aeccfab..b4fc36a265 100644
--- a/django/db/models/indexes.py
+++ b/django/db/models/indexes.py
@@ -11,7 +11,7 @@ class Index:
# cross-database compatibility with Oracle)
max_name_length = 30
- def __init__(self, *, fields=[], name=None):
+ def __init__(self, *, fields=[], name=None, db_tablespace=None):
if not isinstance(fields, list):
raise ValueError('Index.fields must be a list.')
if not fields:
@@ -29,6 +29,7 @@ class Index:
errors.append('Index names cannot be longer than %s characters.' % self.max_name_length)
if errors:
raise ValueError(errors)
+ self.db_tablespace = db_tablespace
def check_name(self):
errors = []
@@ -44,7 +45,7 @@ class Index:
def get_sql_create_template_values(self, model, schema_editor, using):
fields = [model._meta.get_field(field_name) for field_name, order in self.fields_orders]
- tablespace_sql = schema_editor._get_index_tablespace_sql(model, fields)
+ tablespace_sql = schema_editor._get_index_tablespace_sql(model, fields, self.db_tablespace)
quote_name = schema_editor.quote_name
columns = [
('%s %s' % (quote_name(field.column), order)).strip()
@@ -73,7 +74,10 @@ class Index:
def deconstruct(self):
path = '%s.%s' % (self.__class__.__module__, self.__class__.__name__)
path = path.replace('django.db.models.indexes', 'django.db.models')
- return (path, (), {'fields': self.fields, 'name': self.name})
+ kwargs = {'fields': self.fields, 'name': self.name}
+ if self.db_tablespace is not None:
+ kwargs['db_tablespace'] = self.db_tablespace
+ return (path, (), kwargs)
def clone(self):
"""Create a copy of this Index."""