diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index ca18cbb25..564e6fa74 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -7,7 +7,7 @@ from django.conf import settings from django.contrib.auth.models import User from django.contrib.contenttypes.fields import GenericRelation from django.contrib.postgres.fields import ArrayField, JSONField -from django.core.exceptions import ValidationError +from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models from django.db.models import Count, Q, ObjectDoesNotExist @@ -1933,11 +1933,20 @@ class Interface(ComponentModel): """ Include the connected Interface (if any). """ + + # It's possible that an Interface can be deleted _after_ its parent Device/VM, in which case trying to resolve + # the component parent will raise DoesNotExist. For more discussion, see + # https://github.com/digitalocean/netbox/issues/2323 + try: + parent_obj = self.get_component_parent() + except ObjectDoesNotExist: + parent_obj = None + ObjectChange( user=user, request_id=request_id, changed_object=self, - related_object=self.get_component_parent(), + related_object=parent_obj, action=action, object_data=serialize_object(self, extra={ 'connected_interface': self.connected_interface.pk if self.connection else None,