Fixed #29178 -- Allowed Index.fields to accept a tuple.
This commit is contained in:
parent
8411e4a8fe
commit
10c0fe528a
|
@ -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, '')
|
||||
|
|
|
@ -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``
|
||||
--------
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue