diff --git a/netbox_prometheus_sd/api/views.py b/netbox_prometheus_sd/api/views.py index 0e35165..5bab29e 100644 --- a/netbox_prometheus_sd/api/views.py +++ b/netbox_prometheus_sd/api/views.py @@ -1,3 +1,4 @@ +from django.db.models import Prefetch from ipam.models import IPAddress, Service from virtualization.models import VirtualMachine from dcim.models.devices import Device @@ -19,6 +20,19 @@ from dcim.filters import DeviceFilterSet from virtualization.filters import VirtualMachineFilterSet +try: + from tenancy.models import ContactAssignment + + # NOTE: consolidate contacts + nested relations into a single prefetch + _CONTACTS_PREFETCH = [ + Prefetch( + "contacts", + queryset=ContactAssignment.objects.select_related("contact", "role"), + ) + ] +except ImportError: + _CONTACTS_PREFETCH = ["contacts__contact", "contacts__role"] + from ..filtersets import ServiceFilterSet from .serializers import ( PrometheusIPAddressSerializer, @@ -65,8 +79,7 @@ class VirtualMachineViewSet(NetboxPrometheusSDModelViewSet): "cluster__type", "tags", "services", - "contacts__contact", - "contacts__role", + *_CONTACTS_PREFETCH, ) .annotate_config_context_data() ) @@ -78,25 +91,23 @@ class VirtualMachineViewSet(NetboxPrometheusSDModelViewSet): class DeviceViewSet(NetboxPrometheusSDModelViewSet): queryset = ( Device.objects.select_related( - "device_type__manufacturer", + "device_type", "role" if hasattr(Device, "role") else "device_role", "tenant__group", "platform", "site", "location", "rack", - "parent_bay", - "virtual_chassis__master", "oob_ip", + "primary_ip4", + "primary_ip6", ) .prefetch_related( - "primary_ip4__nat_outside", - "primary_ip6__nat_outside", "tags", "services", - "contacts__contact", - "contacts__role", + *_CONTACTS_PREFETCH, ) + .defer("comments") .annotate_config_context_data() ) filterset_class = DeviceFilterSet