Django: Применение индексов к абстрактным моделям, чтобы они были у детей
Можно ли применять индексы к абстрактным моделям так, чтобы все дочерние модели наследовали их?
У меня есть абстрактная модель, которая питает другие модели :
from model_utils.models import UUIDModel
from django.db import models
class TimeStampedUUIDModel(UUIDModel):
created_at = models.DateTimeField(auto_now_add=True, db_index=True)
updated_at = models.DateTimeField(auto_now=True, db_index=True)
class Meta:
abstract = True
class ModelA(TimeStampedUUIDModel):
name_a = models.CharField(max_length=30)
class ModelB(ModelA):
name_b = models.CharField(max_length=30)
И я хотел добавить индекс на эту абстрактную модель, чтобы у меня были :
class Meta:
abstract = True
indexes = (
BrinIndex(fields=['created_at']),
BrinIndex(fields=['updated_at']),
)
У меня такая ошибка:
(models.E016) 'indexes' refers to field 'created_at' which is not local to model 'ModelA'.
HINT: This issue may be caused by multi-table inheritance.
Каким образом лучше всего сделать наследование мета на такой модели?
Каждый индекс должен иметь уникальное имя; поскольку дочерние индексы наследуют имя индекса от родительского, возникает коллизия, поэтому необходимо задать явное имя, содержащее '%(class)s'
:
class TimeStampedUUIDModel(UUIDModel):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
indexes = (
BrinIndex(fields=['created_at'], name='%(class)s_created_at_index'),
BrinIndex(fields=['updated_at'], name='%(class)s_updated_at_index')
)
Если другие модели наследуют от ModelA
, их следует установить как абстрактные. В противном случае сделайте их наследниками от TimeStampedUUIDModel
и переопределите общие поля.