Kaydet (Commit) 10c0fe52 authored tarafından Fabrizio Ettore Messina's avatar Fabrizio Ettore Messina Kaydeden (comit) Tim Graham

Fixed #29178 -- Allowed Index.fields to accept a tuple.

üst 8411e4a8
...@@ -12,12 +12,12 @@ class Index: ...@@ -12,12 +12,12 @@ class Index:
# cross-database compatibility with Oracle) # cross-database compatibility with Oracle)
max_name_length = 30 max_name_length = 30
def __init__(self, *, fields=[], name=None, db_tablespace=None): def __init__(self, *, fields=(), name=None, db_tablespace=None):
if not isinstance(fields, list): if not isinstance(fields, (list, tuple)):
raise ValueError('Index.fields must be a list.') raise ValueError('Index.fields must be a list or tuple.')
if not fields: if not fields:
raise ValueError('At least one field is required to define an index.') 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'). # A list of 2-tuple with the field name and ordering ('' or 'DESC').
self.fields_orders = [ self.fields_orders = [
(field_name[1:], 'DESC') if field_name.startswith('-') else (field_name, '') (field_name[1:], 'DESC') if field_name.startswith('-') else (field_name, '')
......
...@@ -21,7 +21,7 @@ options`_. ...@@ -21,7 +21,7 @@ options`_.
``Index`` 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. Creates an index (B-Tree) in the database.
...@@ -30,7 +30,7 @@ options`_. ...@@ -30,7 +30,7 @@ options`_.
.. attribute:: Index.fields .. 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 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 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 ...@@ -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 ``(headline, pub_date DESC)``. Index ordering isn't supported on MySQL. In that
case, a descending index is created as a normal index. case, a descending index is created as a normal index.
.. versionchanged:: 2.1
Older versions don't accept a tuple.
``name`` ``name``
-------- --------
......
...@@ -28,9 +28,12 @@ class IndexesTests(SimpleTestCase): ...@@ -28,9 +28,12 @@ class IndexesTests(SimpleTestCase):
self.assertNotEqual(index, another_index) self.assertNotEqual(index, another_index)
def test_index_fields_type(self): 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') models.Index(fields='title')
def test_fields_tuple(self):
self.assertEqual(models.Index(fields=('title',)).fields, ['title'])
def test_raises_error_without_field(self): def test_raises_error_without_field(self):
msg = 'At least one field is required to define an index.' msg = 'At least one field is required to define an index.'
with self.assertRaisesMessage(ValueError, msg): with self.assertRaisesMessage(ValueError, msg):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment