diff options
| author | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2017-06-27 21:15:15 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-06-27 21:15:15 +0200 |
| commit | 3297dede7fce4b190f7b3bf0b0fc29a734151b61 (patch) | |
| tree | 1f1c91a72990ccaa7908766a20a64186b2971bc0 /django | |
| parent | 617505ca892fc84c7be1c224ebca2c27f93e8f50 (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.py | 19 | ||||
| -rw-r--r-- | django/db/models/indexes.py | 10 |
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.""" |
