Django Indexes with Model Inheritance

1.2k Views Asked by At

I'm trying to add indexes for my abstract base class model so that its subclasses can also have the same index.

First I had this:

class Test(models.Model):
    id = models.BigAutoField(primary_key=True)
    class Meta:
        abstract = True
        indexes = models.Index(fields=['-id'])

class Testing1(Test):
    pass

class Testing2(Test):
    pass

Traceback:

  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "C:\Users\yoom\Code\test\indexTestingVel\venv\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "C:\Users\yoom\Code\test\indexTestingVel\venv\lib\site-packages\django\core\management\__init__.py", line 357, in execute
    django.setup()
  File "C:\Users\yoom\Code\test\indexTestingVel\venv\lib\site-packages\django\__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "C:\Users\yoom\Code\test\indexTestingVel\venv\lib\site-packages\django\apps\registry.py", line 114, in populate
    app_config.import_models()
  File "C:\Users\yoom\Code\test\indexTestingVel\venv\lib\site-packages\django\apps\config.py", line 211, in import_models
    self.models_module = import_module(models_module_name)
  File "C:\Users\yoom\Code\test\indexTestingVel\venv\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "C:\Users\yoom\Code\test\indexTestingVel\public\models.py", line 4, in <module>
    class Test(models.Model):
  File "C:\Users\yoom\Code\test\indexTestingVel\venv\lib\site-packages\django\db\models\base.py", line 305, in __new__
    new_class._meta.indexes = [copy.deepcopy(idx) for idx in new_class._meta.indexes]
TypeError: 'Index' object is not iterable

This is what I tried next only to get the EXACT same error:

class Test(models.Model):
    id = models.AutoField(primary_key=True)

    class Meta:
        abstract = True


class Testing1(Test):
    class Meta:
        indexes = models.Index(fields=['-id'])


class Testing2(Test):
    class Meta:
        indexes = models.Index(fields=['-id'])

Not sure what to do since I have more than just two subclasses and the abstract model has more than 20 columns.

1

There are 1 best solutions below

1
willeM_ Van Onsem On

The name indexes [Django-doc] is plural, it expects a list of Index objects [Django-doc]:

A list of indexes that you want to define on the model

So you should not assign an Index object itself, but a list of Index objects:

class Test(models.Model):
    id = models.BigAutoField(primary_key=True)
    class Meta:
        abstract = True
        indexes = [models.Index(fields=['-id'])]