mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-27 02:48: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):
|
def ready(self):
|
||||||
from core.api import schema # noqa: F401
|
from core.api import schema # noqa: F401
|
||||||
|
from core.checks import check_duplicate_indexes # noqa: F401
|
||||||
from netbox.models.features import register_models
|
from netbox.models.features import register_models
|
||||||
from . import data_backends, events, search # noqa: F401
|
from . import data_backends, events, search # noqa: F401
|
||||||
from netbox import context_managers # 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