Просмотр исходного кода

Fixes #23559: Fix prefetching of display attributes for global search results

Jeremy Stretch 2 дней назад
Родитель
Сommit
18f38d112c
2 измененных файлов с 15 добавлено и 1 удалено
  1. 1 1
      netbox/netbox/search/backends.py
  2. 14 0
      netbox/netbox/tests/test_search.py

+ 1 - 1
netbox/netbox/search/backends.py

@@ -242,7 +242,7 @@ class CachedValueSearchBackend(SearchBackend):
             # Compile a list of all CachedValues referencing this object type, and prefetch
             # any related objects
             if prefetch_fields:
-                objects = [r for r in results if r.object_type == object_type]
+                objects = [r for r in results if r.object_type_id == object_type.pk]
                 prefetch_related_objects(objects, *prefetch_fields)
 
         # Omit any results pertaining to an object the user does not have permission to view

+ 14 - 0
netbox/netbox/tests/test_search.py

@@ -17,6 +17,7 @@ from extras.models import CachedValue
 from netbox.search import deferred
 from netbox.search.backends import SearchBackend, search_backend
 from netbox.search.jobs import SearchCacheJob
+from tenancy.models import Tenant
 from utilities.testing.mixins import RQQueueTestMixin
 
 
@@ -192,6 +193,19 @@ class SearchBackendTestCase(TestCase):
         results = search_backend.search('xxxxx')
         self.assertEqual(len(results), 0)
 
+    def test_search_prefetch_display_attrs(self):
+        """
+        Check that ForeignKey fields listed in an indexer's display_attrs are prefetched.
+        """
+        tenant = Tenant.objects.create(name='Tenant 1', slug='tenant-1')
+        Site.objects.update(tenant=tenant)
+        search_backend.cache(Site.objects.all())
+
+        results = search_backend.search('site')
+        self.assertEqual(len(results), 3)
+        for result in results:
+            self.assertTrue(Site.tenant.field.is_cached(result.object))
+
 
 class DeferredCachingTestCase(RQQueueTestMixin, TestCase):
     """