From b0478a7e5bc5d53458588f91bef556e4aa36866e Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 4 May 2020 11:47:30 -0400 Subject: [PATCH] Enable dynamic queryset field prefetching based on table columns --- netbox/utilities/tables.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/netbox/utilities/tables.py b/netbox/utilities/tables.py index d59e4b647..e5433e3f8 100644 --- a/netbox/utilities/tables.py +++ b/netbox/utilities/tables.py @@ -1,4 +1,7 @@ import django_tables2 as tables +from django.core.exceptions import FieldDoesNotExist +from django.db.models import ForeignKey +from django_tables2.data import TableQuerysetData from django.utils.safestring import mark_safe @@ -45,6 +48,21 @@ class BaseTable(tables.Table): self.base_columns['actions'] = actions self.sequence.append('actions') + # Dynamically update the table's QuerySet to ensure related fields are pre-fetched + if isinstance(self.data, TableQuerysetData): + model = getattr(self.Meta, 'model') + prefetch_fields = [] + for column in self.columns: + if column.visible: + field_path = column.accessor.split('.') + try: + model_field = model._meta.get_field(field_path[0]) + if isinstance(model_field, ForeignKey): + prefetch_fields.append('__'.join(field_path)) + except FieldDoesNotExist: + pass + self.data.data = self.data.data.prefetch_related(None).prefetch_related(*prefetch_fields) + @property def configurable_columns(self): selected_columns = [