Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django中相关模型的有效计数_Python_Django - Fatal编程技术网

Python 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

在我的Django应用程序中,当我将
host\u count
字段添加到序列化程序中以获取每个域的主机数时,API响应的性能会显著降低

  • 无主机计数时:300ms
  • 使用主机计数时:15秒
我尝试将“主机集”添加到与预回迁相关的方法中,但没有帮助

使用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()
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分组
谢谢!这解决了我的问题。