diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 7eda7d8cd..c8d445c1c 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1821,8 +1821,7 @@ class DeviceForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): # Collect interface IPs interface_ips = IPAddress.objects.prefetch_related('interface').filter( address__family=family, - assigned_object_type=ContentType.objects.get_for_model(Interface), - assigned_object_id__in=interface_ids + interface__in=interface_ids ) if interface_ips: ip_list = [(ip.id, '{} ({})'.format(ip.address, ip.interface)) for ip in interface_ips] @@ -1830,8 +1829,7 @@ class DeviceForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): # Collect NAT IPs nat_ips = IPAddress.objects.prefetch_related('nat_inside').filter( address__family=family, - nat_inside__assigned_object_type=ContentType.objects.get_for_model(Interface), - nat_inside__assigned_object_id__in=interface_ids + nat_inside__interface__in=interface_ids ) if nat_ips: ip_list = [(ip.id, '{} ({})'.format(ip.address, ip.nat_inside.address)) for ip in nat_ips] diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 8724994f5..fdbeeade8 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -689,7 +689,8 @@ class Interface(CableTermination, ComponentModel, BaseInterface): ip_addresses = GenericRelation( to='ipam.IPAddress', content_type_field='assigned_object_type', - object_id_field='assigned_object_id' + object_id_field='assigned_object_id', + related_query_name='interface' ) tags = TaggableManager(through=TaggedItem) diff --git a/netbox/ipam/filters.py b/netbox/ipam/filters.py index aa3fa885b..c9012cd3a 100644 --- a/netbox/ipam/filters.py +++ b/netbox/ipam/filters.py @@ -1,6 +1,5 @@ import django_filters import netaddr -from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.db.models import Q from netaddr.core import AddrFormatError @@ -12,7 +11,7 @@ from utilities.filters import ( BaseFilterSet, MultiValueCharFilter, MultiValueNumberFilter, NameSlugSearchFilterSet, TagFilter, TreeNodeMultipleChoiceFilter, ) -from virtualization.models import Interface as VMInterface, VirtualMachine +from virtualization.models import VirtualMachine from .choices import * from .models import Aggregate, IPAddress, Prefix, RIR, Role, Service, VLAN, VLANGroup, VRF @@ -386,8 +385,7 @@ class IPAddressFilterSet(BaseFilterSet, TenancyFilterSet, CustomFieldFilterSet, for device in devices: interface_ids.extend(device.vc_interfaces.values_list('id', flat=True)) return queryset.filter( - assigned_object_type=ContentType.objects.get_for_model(Interface), - assigned_object_id__in=interface_ids + interface__in=interface_ids ) def filter_virtual_machine(self, queryset, name, value): @@ -398,8 +396,7 @@ class IPAddressFilterSet(BaseFilterSet, TenancyFilterSet, CustomFieldFilterSet, for vm in virtual_machines: interface_ids.extend(vm.interfaces.values_list('id', flat=True)) return queryset.filter( - assigned_object_type=ContentType.objects.get_for_model(VMInterface), - assigned_object_id__in=interface_ids + vm_interface__in=interface_ids ) def _assigned_to_interface(self, queryset, name, value): diff --git a/netbox/ipam/forms.py b/netbox/ipam/forms.py index a66a306da..3ffbc2d4f 100644 --- a/netbox/ipam/forms.py +++ b/netbox/ipam/forms.py @@ -1,8 +1,7 @@ from django import forms -from django.contrib.contenttypes.models import ContentType from django.core.validators import MaxValueValidator, MinValueValidator -from dcim.models import Device, Interface, Rack, Region, Site +from dcim.models import Device, Rack, Region, Site from extras.forms import ( AddRemoveTagsForm, CustomFieldBulkEditForm, CustomFieldModelCSVForm, CustomFieldModelForm, CustomFieldFilterForm, ) @@ -15,7 +14,7 @@ from utilities.forms import ( ExpandableIPAddressField, ReturnURLForm, SlugField, StaticSelect2, StaticSelect2Multiple, TagFilterField, BOOLEAN_WITH_BLANK_CHOICES, ) -from virtualization.models import Interface as VMInterface, VirtualMachine +from virtualization.models import VirtualMachine from .choices import * from .constants import * from .models import Aggregate, IPAddress, Prefix, RIR, Role, Service, VLAN, VLANGroup, VRF @@ -1196,13 +1195,11 @@ class ServiceForm(BootstrapMixin, CustomFieldModelForm): # Limit IP address choices to those assigned to interfaces of the parent device/VM if self.instance.device: self.fields['ipaddresses'].queryset = IPAddress.objects.filter( - assigned_object_type=ContentType.objects.get_for_model(Interface), - assigned_object_id__in=self.instance.device.vc_interfaces.values_list('id', flat=True) + interface__in=self.instance.device.vc_interfaces.values_list('id', flat=True) ) elif self.instance.virtual_machine: self.fields['ipaddresses'].queryset = IPAddress.objects.filter( - assigned_object_type=ContentType.objects.get_for_model(VMInterface), - assigned_object_id__in=self.instance.virtual_machine.interfaces.values_list('id', flat=True) + vm_interface__in=self.instance.virtual_machine.interfaces.values_list('id', flat=True) ) else: self.fields['ipaddresses'].choices = [] diff --git a/netbox/virtualization/forms.py b/netbox/virtualization/forms.py index 4c62df344..500de821b 100644 --- a/netbox/virtualization/forms.py +++ b/netbox/virtualization/forms.py @@ -1,5 +1,4 @@ from django import forms -from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from dcim.choices import InterfaceModeChoices @@ -358,8 +357,7 @@ class VirtualMachineForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): # Collect interface IPs interface_ips = IPAddress.objects.prefetch_related('interface').filter( address__family=family, - assigned_object_type=ContentType.objects.get_for_model(Interface), - assigned_object_id__in=self.instance.interfaces.values_list('id', flat=True) + vm_interface__in=self.instance.interfaces.values_list('id', flat=True) ) if interface_ips: ip_choices.append( @@ -370,8 +368,7 @@ class VirtualMachineForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): # Collect NAT IPs nat_ips = IPAddress.objects.prefetch_related('nat_inside').filter( address__family=family, - nat_inside__assigned_object_type=ContentType.objects.get_for_model(Interface), - nat_inside__assigned_object_id__in=self.instance.interfaces.values_list('id', flat=True) + nat_inside__vm_interface__in=self.instance.interfaces.values_list('id', flat=True) ) if nat_ips: ip_choices.append( diff --git a/netbox/virtualization/models.py b/netbox/virtualization/models.py index de6073b4f..2adf821a5 100644 --- a/netbox/virtualization/models.py +++ b/netbox/virtualization/models.py @@ -408,7 +408,8 @@ class Interface(BaseInterface): ip_addresses = GenericRelation( to='ipam.IPAddress', content_type_field='assigned_object_type', - object_id_field='assigned_object_id' + object_id_field='assigned_object_id', + related_query_name='vm_interface' ) tags = TaggableManager( through=TaggedItem,