mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-26 18:38:38 -06:00
Add a system check for duplicate indexes
This commit is contained in:
parent
48ecc2564a
commit
b0c5be2e91
@ -19,6 +19,7 @@ class CoreConfig(AppConfig):
|
||||
|
||||
def ready(self):
|
||||
from core.api import schema # noqa: F401
|
||||
from core.checks import check_duplicate_indexes # noqa: F401
|
||||
from netbox.models.features import register_models
|
||||
from . import data_backends, events, search # noqa: F401
|
||||
from netbox import context_managers # noqa: F401
|
||||
|
41
netbox/core/checks.py
Normal file
41
netbox/core/checks.py
Normal file
@ -0,0 +1,41 @@
|
||||
from django.core.checks import Error, register, Tags
|
||||
from django.db.models import Index, UniqueConstraint
|
||||
from django.apps import apps
|
||||
|
||||
__all__ = (
|
||||
'check_duplicate_indexes',
|
||||
)
|
||||
|
||||
|
||||
@register(Tags.models)
|
||||
def check_duplicate_indexes(app_configs, **kwargs):
|
||||
"""
|
||||
Check for an index which is redundant to a declared unique constraint.
|
||||
"""
|
||||
errors = []
|
||||
|
||||
for model in apps.get_models():
|
||||
if not (meta := getattr(model, "_meta", None)):
|
||||
continue
|
||||
|
||||
index_fields = {
|
||||
tuple(index.fields) for index in getattr(meta, 'indexes', [])
|
||||
if isinstance(index, Index)
|
||||
}
|
||||
constraint_fields = {
|
||||
tuple(constraint.fields) for constraint in getattr(meta, 'constraints', [])
|
||||
if isinstance(constraint, UniqueConstraint)
|
||||
}
|
||||
|
||||
# Find overlapping definitions
|
||||
if duplicated := index_fields & constraint_fields:
|
||||
for fields in duplicated:
|
||||
errors.append(
|
||||
Error(
|
||||
f"Model '{model.__name__}' defines the same field set {fields} in both `Meta.indexes` and "
|
||||
f"`Meta.constraints`.",
|
||||
obj=model,
|
||||
)
|
||||
)
|
||||
|
||||
return errors
|
Loading…
Reference in New Issue
Block a user