From a9cfc9aebcc96fc6d95c0d93d9106e666d01b2a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Sat, 23 Jun 2018 21:19:11 +0000 Subject: [PATCH] DNS endpoint SQL optimization --- api/serializers.py | 3 ++- api/views.py | 9 ++++++++- machines/models.py | 15 ++++++++++++--- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/api/serializers.py b/api/serializers.py index 92f54427..48988365 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -701,10 +701,11 @@ class CNAMERecordSerializer(serializers.ModelSerializer): """ alias = serializers.CharField(source='cname.name', read_only=True) hostname = serializers.CharField(source='name', read_only=True) + extension = serializers.CharField(source='extension.name', read_only=True) class Meta: model = machines.Domain - fields = ('alias', 'hostname') + fields = ('alias', 'hostname', 'extension') class DNSZonesSerializer(serializers.ModelSerializer): diff --git a/api/views.py b/api/views.py index d5245f2f..8fffe606 100644 --- a/api/views.py +++ b/api/views.py @@ -491,7 +491,14 @@ class DNSZonesView(generics.ListAPIView): """Exposes the detailed information about each extension (hostnames, IPs, DNS records, etc.) in order to build the DNS zone files. """ - queryset = machines.Extension.objects.all() + queryset = (machines.Extension.objects + .prefetch_related('soa') + .prefetch_related('ns_set').prefetch_related('ns_set__ns') + .prefetch_related('origin') + .prefetch_related('mx_set').prefetch_related('mx_set__name') + .prefetch_related('txt_set') + .prefetch_related('srv_set').prefetch_related('srv_set__target') + .all()) serializer_class = serializers.DNSZonesSerializer diff --git a/machines/models.py b/machines/models.py index 817e9d5a..50d99aaa 100644 --- a/machines/models.py +++ b/machines/models.py @@ -563,13 +563,22 @@ class Extension(RevMixin, AclMixin, models.Model): return entry def get_associated_a_records(self): - return Interface.objects.filter(type__ip_type__extension=self).filter(ipv4__isnull=False) + return (Interface.objects + .filter(type__ip_type__extension=self) + .filter(ipv4__isnull=False) + .prefetch_related('domain') + .prefetch_related('ipv4')) def get_associated_aaaa_records(self): - return Interface.objects.filter(type__ip_type__extension=self) + return (Interface.objects + .filter(type__ip_type__extension=self) + .prefetch_related('domain')) def get_associated_cname_records(self): - return Domain.objects.filter(extension=self).filter(cname__isnull=False) + return (Domain.objects + .filter(extension=self) + .filter(cname__isnull=False) + .prefetch_related('cname')) @staticmethod def can_use_all(user_request, *_args, **_kwargs):