簡體   English   中英

Django 中相關模型的有效計數

[英]Efficient Count of Related Models in Django

在我的 Django 應用程序中,當我將host_count字段添加到我的序列化程序以獲取每個域的主機數時,API 響應的性能會受到嚴重影響。

  • 沒有host_count :300ms
  • 使用host_count : 15s

我嘗試將“host_set”添加到 prefetch_related 方法,但沒有幫助。

使用 Count 的注釋會幫助我嗎? 如何優化該值的獲取?

序列化程序.py

class DomainSerializer(serializers.Serializer):
    name = serializers.CharField(read_only=True)
    org_name = serializers.CharField(source='org.name', read_only=True)
    created = serializers.DateTimeField(read_only=True)
    last_host_search = serializers.DateTimeField(read_only=True)
    host_count = serializers.SerializerMethodField()

    def get_host_count(self, obj):
        return Host.objects.filter(domain=obj).count()

視圖.py

class DomainList(generics.ListAPIView):
    def get(self, request, format=None):
        domains = Domain.objects.prefetch_related('org').all()
        serializer = DomainSerializer(domains, many=True)
        return Response(serializer.data)

模型.py

class Domain(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    last_host_search = models.DateTimeField(auto_now=True)
    name = models.CharField(unique=True, max_length=settings.MAX_CHAR_COUNT, blank=False, null=False)
    org = models.ForeignKey(Org, on_delete=models.CASCADE, blank=True, null=True)

您可以使用.annotate(…) [Django-doc]來計算同一查詢中的相關對象:

from django.db.models import Count

class DomainList(generics.ListAPIView):
    def get(self, request, format=None):
        domains = Domain.objects.prefetch_related('org').annotate(
            host_count=Count('host')
        )
        serializer = DomainSerializer(domains, many=True)
        return Response(serializer.data)

在序列化程序中,您只需檢索相應的屬性:

class DomainSerializer(serializers.Serializer):
    name = serializers.CharField(read_only=True)
    org_name = serializers.CharField(source='org.name', read_only=True)
    created = serializers.DateTimeField(read_only=True)
    last_host_search = serializers.DateTimeField(read_only=True)
    host_count = serializers.IntegerField(read_only=True)

這將進行如下查詢:

SELECT domain.*, org.*, COUNT(host.id)
FROM domain
LEFT OUTER JOIN org ON domain.org_id = org.id
LEFT OUTER JOIN host ON host.domain_id = domain.id
GROUP BY domain.id, org.id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM