diff --git a/django/db/models/indexes.py b/django/db/models/indexes.py index fc24433a33..b601d98492 100644 --- a/django/db/models/indexes.py +++ b/django/db/models/indexes.py @@ -12,12 +12,12 @@ class Index: # cross-database compatibility with Oracle) max_name_length = 30 - def __init__(self, *, fields=[], name=None, db_tablespace=None): - if not isinstance(fields, list): - raise ValueError('Index.fields must be a list.') + def __init__(self, *, fields=(), name=None, db_tablespace=None): + if not isinstance(fields, (list, tuple)): + raise ValueError('Index.fields must be a list or tuple.') if not fields: raise ValueError('At least one field is required to define an index.') - self.fields = fields + self.fields = list(fields) # A list of 2-tuple with the field name and ordering ('' or 'DESC'). self.fields_orders = [ (field_name[1:], 'DESC') if field_name.startswith('-') else (field_name, '') diff --git a/docs/ref/models/indexes.txt b/docs/ref/models/indexes.txt index daecdd7f9a..5cb4f4ea2f 100644 --- a/docs/ref/models/indexes.txt +++ b/docs/ref/models/indexes.txt @@ -21,7 +21,7 @@ options`_. ``Index`` options ================= -.. class:: Index(fields=[], name=None, db_tablespace=None) +.. class:: Index(fields=(), name=None, db_tablespace=None) Creates an index (B-Tree) in the database. @@ -30,7 +30,7 @@ options`_. .. attribute:: Index.fields -A list of the name of the fields on which the index is desired. +A list or tuple of the name of the fields on which the index is desired. By default, indexes are created with an ascending order for each column. To define an index with a descending order for a column, add a hyphen before the @@ -40,6 +40,10 @@ For example ``Index(fields=['headline', '-pub_date'])`` would create SQL with ``(headline, pub_date DESC)``. Index ordering isn't supported on MySQL. In that case, a descending index is created as a normal index. +.. versionchanged:: 2.1 + + Older versions don't accept a tuple. + ``name`` -------- diff --git a/tests/model_indexes/tests.py b/tests/model_indexes/tests.py index 28759dbe80..c75c8e8473 100644 --- a/tests/model_indexes/tests.py +++ b/tests/model_indexes/tests.py @@ -28,9 +28,12 @@ class IndexesTests(SimpleTestCase): self.assertNotEqual(index, another_index) def test_index_fields_type(self): - with self.assertRaisesMessage(ValueError, 'Index.fields must be a list.'): + with self.assertRaisesMessage(ValueError, 'Index.fields must be a list or tuple.'): models.Index(fields='title') + def test_fields_tuple(self): + self.assertEqual(models.Index(fields=('title',)).fields, ['title']) + def test_raises_error_without_field(self): msg = 'At least one field is required to define an index.' with self.assertRaisesMessage(ValueError, msg):