Python Django中相关模型的有效计数
在我的Django应用程序中,当我将Python Django中相关模型的有效计数,python,django,Python,Django,在我的Django应用程序中,当我将host\u count字段添加到序列化程序中以获取每个域的主机数时,API响应的性能会显著降低 无主机计数时:300ms 使用主机计数时:15秒 我尝试将“主机集”添加到与预回迁相关的方法中,但没有帮助 使用Count的注释在这里对我有帮助吗?如何优化此值的获取 序列化程序.py class DomainSerializer(serializers.Serializer): name = serializers.CharField(read_on
host\u count
字段添加到序列化程序中以获取每个域的主机数时,API响应的性能会显著降低
- 无主机计数时:300ms
- 使用主机计数时:15秒
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()
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)
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)
视图.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()
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)
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)
型号.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()
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)
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)
您可以使用统计同一查询中的相关对象:
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)
从django.db.models导入计数
类DomainList(generics.ListAPIView):
def get(自我、请求、格式=无):
domains=Domain.objects.prefetch_related('org')。注释(
主机计数=计数('主机')
)
serializer=DomainSerializer(域,多个=True)
返回响应(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)
class DomainSerializer(serializers.Serializer):
name=serializers.CharField(只读=True)
org\u name=serializers.CharField(source='org.name',read\u only=True)
created=serializers.DateTimeField(只读=True)
last_host_search=serializers.DateTimeField(只读=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
选择域。*、组织。*、计数(host.id)
来自域
domain.org_id=org.id上的左外部加入组织
host.domain_id=domain.id上的左外部联接主机
按domain.id、org.id分组
谢谢!这解决了我的问题。