Optimize query for job events for a single job to speed up loading job details page.

This commit is contained in:
Chris Church 2016-12-01 18:33:05 -05:00
parent 8911766eea
commit 1ce81f9640
2 changed files with 17 additions and 8 deletions

View File

@ -2490,16 +2490,15 @@ class JobEventSerializer(BaseSerializer):
def get_related(self, obj):
res = super(JobEventSerializer, self).get_related(obj)
res.update(dict(
job = reverse('api:job_detail', args=(obj.job.pk,)),
#children = reverse('api:job_event_children_list', args=(obj.pk,)),
job = reverse('api:job_detail', args=(obj.job_id,)),
))
if obj.parent:
res['parent'] = reverse('api:job_event_detail', args=(obj.parent.pk,))
if obj.children.count():
if obj.parent_id:
res['parent'] = reverse('api:job_event_detail', args=(obj.parent_id,))
if obj.children.exists():
res['children'] = reverse('api:job_event_children_list', args=(obj.pk,))
if obj.host:
res['host'] = reverse('api:host_detail', args=(obj.host.pk,))
if obj.hosts.count():
if obj.host_id:
res['host'] = reverse('api:host_detail', args=(obj.host_id,))
if obj.hosts.exists():
res['hosts'] = reverse('api:job_event_hosts_list', args=(obj.pk,))
return res

View File

@ -3502,6 +3502,16 @@ class JobJobEventsList(BaseJobEventsList):
parent_model = Job
def get_queryset(self):
job = self.get_parent_object()
self.check_parent_access(job)
qs = job.job_events.all()
qs = qs.select_related('host')
qs = qs.prefetch_related('hosts', 'children')
if self.request.user.is_superuser or self.request.user.is_system_auditor:
return qs.all()
return qs.filter(Q(host__isnull=True) | Q(host__in=host_qs))
class JobJobPlaysList(BaseJobEventsList):