From 1a57081d2e03fa65faf4aff6e14c9e5a20f235b9 Mon Sep 17 00:00:00 2001 From: bctiemann Date: Mon, 3 Nov 2025 19:54:06 -0500 Subject: [PATCH 1/2] Filter object fields to only check one related_object_type per COT in _has_circular_reference --- netbox_custom_objects/api/serializers.py | 1 + netbox_custom_objects/models.py | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/netbox_custom_objects/api/serializers.py b/netbox_custom_objects/api/serializers.py index 69aa67f..0df23e4 100644 --- a/netbox_custom_objects/api/serializers.py +++ b/netbox_custom_objects/api/serializers.py @@ -57,6 +57,7 @@ class Meta: "related_object_type", "app_label", "model", + "group_name", ) def validate(self, attrs): diff --git a/netbox_custom_objects/models.py b/netbox_custom_objects/models.py index 858a68a..3d117f3 100644 --- a/netbox_custom_objects/models.py +++ b/netbox_custom_objects/models.py @@ -1071,6 +1071,7 @@ def _has_circular_reference(self, custom_object_type, visited): visited.add(custom_object_type.id) # Check all object and multiobject fields in this custom object type + related_objects_checked = set() for field in custom_object_type.fields.filter( type__in=[ CustomFieldTypeChoices.TYPE_OBJECT, @@ -1079,6 +1080,9 @@ def _has_circular_reference(self, custom_object_type, visited): related_object_type__isnull=False, related_object_type__app_label=APP_LABEL ): + if field.related_object_type in related_objects_checked: + continue + related_objects_checked.add(field.related_object_type) # Get the related custom object type directly from the object_type relationship try: From 9a26cdc336eeba9775325105e2d06bd72c4a884c Mon Sep 17 00:00:00 2001 From: bctiemann Date: Mon, 3 Nov 2025 19:54:06 -0500 Subject: [PATCH 2/2] Filter object fields to only check one related_object_type per COT in _has_circular_reference --- netbox_custom_objects/models.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/netbox_custom_objects/models.py b/netbox_custom_objects/models.py index 858a68a..3d117f3 100644 --- a/netbox_custom_objects/models.py +++ b/netbox_custom_objects/models.py @@ -1071,6 +1071,7 @@ def _has_circular_reference(self, custom_object_type, visited): visited.add(custom_object_type.id) # Check all object and multiobject fields in this custom object type + related_objects_checked = set() for field in custom_object_type.fields.filter( type__in=[ CustomFieldTypeChoices.TYPE_OBJECT, @@ -1079,6 +1080,9 @@ def _has_circular_reference(self, custom_object_type, visited): related_object_type__isnull=False, related_object_type__app_label=APP_LABEL ): + if field.related_object_type in related_objects_checked: + continue + related_objects_checked.add(field.related_object_type) # Get the related custom object type directly from the object_type relationship try: