Fixed #28330 -- Prevented passing positional arguments to an Index.

Thanks Tim Graham for the review.
This commit is contained in:
Mariusz Felisiak 2017-06-27 19:39:37 +02:00 committed by Tim Graham
parent d381914aef
commit 617505ca89
4 changed files with 18 additions and 7 deletions

View File

@ -11,11 +11,11 @@ class BrinIndex(Index):
# applicable. # applicable.
max_name_length = 31 max_name_length = 31
def __init__(self, fields=[], name=None, pages_per_range=None): def __init__(self, *, pages_per_range=None, **kwargs):
if pages_per_range is not None and pages_per_range <= 0: if pages_per_range is not None and pages_per_range <= 0:
raise ValueError('pages_per_range must be None or a positive integer') raise ValueError('pages_per_range must be None or a positive integer')
self.pages_per_range = pages_per_range self.pages_per_range = pages_per_range
super().__init__(fields, name) super().__init__(**kwargs)
def deconstruct(self): def deconstruct(self):
path, args, kwargs = super().deconstruct() path, args, kwargs = super().deconstruct()
@ -33,10 +33,10 @@ class BrinIndex(Index):
class GinIndex(Index): class GinIndex(Index):
suffix = 'gin' suffix = 'gin'
def __init__(self, fields=[], name=None, fastupdate=None, gin_pending_list_limit=None): def __init__(self, *, fastupdate=None, gin_pending_list_limit=None, **kwargs):
self.fastupdate = fastupdate self.fastupdate = fastupdate
self.gin_pending_list_limit = gin_pending_list_limit self.gin_pending_list_limit = gin_pending_list_limit
super().__init__(fields, name) super().__init__(**kwargs)
def deconstruct(self): def deconstruct(self):
path, args, kwargs = super().deconstruct() path, args, kwargs = super().deconstruct()

View File

@ -11,7 +11,7 @@ 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): def __init__(self, *, fields=[], name=None):
if not isinstance(fields, list): if not isinstance(fields, list):
raise ValueError('Index.fields must be a list.') raise ValueError('Index.fields must be a list.')
if not fields: if not fields:

View File

@ -12,7 +12,7 @@ available from the ``django.contrib.postgres.indexes`` module.
``BrinIndex`` ``BrinIndex``
============= =============
.. class:: BrinIndex(fields=[], name=None, pages_per_range=None) .. class:: BrinIndex(pages_per_range=None, **options)
Creates a `BRIN index Creates a `BRIN index
<https://www.postgresql.org/docs/current/static/brin-intro.html>`_. <https://www.postgresql.org/docs/current/static/brin-intro.html>`_.
@ -22,7 +22,7 @@ available from the ``django.contrib.postgres.indexes`` module.
``GinIndex`` ``GinIndex``
============ ============
.. class:: GinIndex(fields=[], name=None, fastupdate=None, gin_pending_list_limit=None) .. class:: GinIndex(fastupdate=None, gin_pending_list_limit=None, **options)
Creates a `gin index Creates a `gin index
<https://www.postgresql.org/docs/current/static/gin.html>`_. <https://www.postgresql.org/docs/current/static/gin.html>`_.

View File

@ -404,6 +404,17 @@ For custom management commands that use options not created using
class MyCommand(BaseCommand): class MyCommand(BaseCommand):
stealth_options = ('option_name', ...) stealth_options = ('option_name', ...)
Indexes no longer accept positional arguments
---------------------------------------------
For example::
models.Index(['headline', '-pub_date'], 'index_name')
raises an exception and should be replaced with::
models.Index(fields=['headline', '-pub_date'], name='index_name')
Miscellaneous Miscellaneous
------------- -------------