Skip to content

Commit ccb8297

Browse files
jdufresnetimgraham
authored andcommitted
[1.11.x] Fixed #28282 -- Fixed class-based indexes name for models that only inherit Model.
Backport of 0c3c37a from master
1 parent 319839d commit ccb8297

File tree

4 files changed

+19
-8
lines changed

4 files changed

+19
-8
lines changed

django/db/models/base.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -303,14 +303,15 @@ def __new__(cls, name, bases, attrs):
303303
else:
304304
new_class.add_to_class(field.name, copy.deepcopy(field))
305305

306-
if base_meta and base_meta.abstract and not abstract:
307-
new_class._meta.indexes = [copy.deepcopy(idx) for idx in new_class._meta.indexes]
308-
# Set the name of _meta.indexes. This can't be done in
309-
# Options.contribute_to_class() because fields haven't been added
310-
# to the model at that point.
311-
for index in new_class._meta.indexes:
312-
if not index.name:
313-
index.set_name_with_model(new_class)
306+
# Copy indexes so that index names are unique when models extend an
307+
# abstract model.
308+
new_class._meta.indexes = [copy.deepcopy(idx) for idx in new_class._meta.indexes]
309+
# Set the name of _meta.indexes. This can't be done in
310+
# Options.contribute_to_class() because fields haven't been added to
311+
# the model at that point.
312+
for index in new_class._meta.indexes:
313+
if not index.name:
314+
index.set_name_with_model(new_class)
314315

315316
if abstract:
316317
# Abstract base models can't be instantiated and don't appear in

docs/releases/1.11.3.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,6 @@ Bugfixes
2323
(:ticket:`28202`).
2424

2525
* Fixed invalid HTML for a required ``AdminFileWidget`` (:ticket:`28278`).
26+
27+
* Fixed model initialization to set the name of class-based model indexes
28+
for models that only inherit ``models.Model`` (:ticket:`28282`).

tests/model_indexes/models.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ class Book(models.Model):
66
author = models.CharField(max_length=50)
77
pages = models.IntegerField(db_column='page_count')
88

9+
class Meta:
10+
indexes = [models.indexes.Index(fields=['title'])]
11+
912

1013
class AbstractModel(models.Model):
1114
name = models.CharField(max_length=50)

tests/model_indexes/tests.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ def test_clone(self):
8383
self.assertIsNot(index, new_index)
8484
self.assertEqual(index.fields, new_index.fields)
8585

86+
def test_name_set(self):
87+
index_names = [index.name for index in Book._meta.indexes]
88+
self.assertEqual(index_names, ['model_index_title_196f42_idx'])
89+
8690
def test_abstract_children(self):
8791
index_names = [index.name for index in ChildModel1._meta.indexes]
8892
self.assertEqual(index_names, ['model_index_name_440998_idx'])

0 commit comments

Comments
 (0)