From 4c62cdaa1041d49d0b46f6cef5f4618f020fff29 Mon Sep 17 00:00:00 2001 From: Hannes Ljungberg Date: Tue, 12 Jan 2021 13:05:01 +0100 Subject: [PATCH] Refs #26709 -- Made Index raise ValueError on non-string fields. --- django/db/models/indexes.py | 2 ++ tests/model_indexes/tests.py | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/django/db/models/indexes.py b/django/db/models/indexes.py index c5fb5789fe7..fddde3b16f3 100644 --- a/django/db/models/indexes.py +++ b/django/db/models/indexes.py @@ -35,6 +35,8 @@ class Index: raise ValueError('Index.fields and Index.opclasses must have the same number of elements.') if not fields: raise ValueError('At least one field is required to define an index.') + if not all(isinstance(field, str) for field in fields): + raise ValueError('Index.fields must contain only strings with field names.') if include and not name: raise ValueError('A covering index must be named.') if not isinstance(include, (type(None), list, tuple)): diff --git a/tests/model_indexes/tests.py b/tests/model_indexes/tests.py index 93ac47130a8..1fe283340e6 100644 --- a/tests/model_indexes/tests.py +++ b/tests/model_indexes/tests.py @@ -55,6 +55,11 @@ class SimpleIndexesTests(SimpleTestCase): with self.assertRaisesMessage(ValueError, 'Index.fields must be a list or tuple.'): models.Index(fields='title') + def test_index_fields_strings(self): + msg = 'Index.fields must contain only strings with field names.' + with self.assertRaisesMessage(ValueError, msg): + models.Index(fields=[models.F('title')]) + def test_fields_tuple(self): self.assertEqual(models.Index(fields=('title',)).fields, ['title'])