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
Django rest框架数据库查询速度慢 我有一个Django模型,有16个分贝 我创建了一个 ListAPIView以获取此数据 这个模型有5000个实例 在我的数据库中,对这个api视图的GET请求花费了超过15分钟的时间 秒_Django_Serialization_Query Optimization_Django Rest Framework_Django Queryset - Fatal编程技术网

Django rest框架数据库查询速度慢 我有一个Django模型,有16个分贝 我创建了一个 ListAPIView以获取此数据 这个模型有5000个实例 在我的数据库中,对这个api视图的GET请求花费了超过15分钟的时间 秒

Django rest框架数据库查询速度慢 我有一个Django模型,有16个分贝 我创建了一个 ListAPIView以获取此数据 这个模型有5000个实例 在我的数据库中,对这个api视图的GET请求花费了超过15分钟的时间 秒,django,serialization,query-optimization,django-rest-framework,django-queryset,Django,Serialization,Query Optimization,Django Rest Framework,Django Queryset,型号: class MyModel(models.Model): f1 = models.DecimalField (max_digits=8, decimal_places=3) f2 = models.DecimalField (max_digits=8, decimal_places=3) f3 = models.DecimalField (max_digits=8, decimal_places=3) f4 = models.DecimalField (m

型号:

class MyModel(models.Model):
    f1 = models.DecimalField (max_digits=8, decimal_places=3)
    f2 = models.DecimalField (max_digits=8, decimal_places=3)
    f3 = models.DecimalField (max_digits=8, decimal_places=3)
    f4 = models.DecimalField (max_digits=8, decimal_places=3)
    f5 = models.DecimalField (max_digits=8, decimal_places=3)
    f6 = models.DecimalField (max_digits=8, decimal_places=3)
    f7 = models.DecimalField (max_digits=8, decimal_places=3)
    f8 = models.DecimalField (max_digits=8, decimal_places=3)
    f9 = models.DecimalField (max_digits=8, decimal_places=3)
    f10 = models.DecimalField (max_digits=8, decimal_places=3)
    f11 = models.DecimalField (max_digits=8, decimal_places=3)
    f12 = models.DecimalField (max_digits=8, decimal_places=3)
    f13 = models.DecimalField (max_digits=8, decimal_places=3)
    f14 = models.DecimalField (max_digits=8, decimal_places=3)
    f15 = models.DecimalField (max_digits=8, decimal_places=3)
    f16 = models.DecimalField (max_digits=8, decimal_places=3)
序列化程序:

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
我没有对数据进行任何过滤。当我在django shell中运行查询时,它会在几毫秒内运行。我假设这里的问题是序列化。但是,我使用的是默认的ModelSerializer

所有这些字段都在同一个表中,因此我不认为这里会出现N+1问题


我可以做些什么来进一步分析这个问题?对于这么多的模型实例,我应该期望我的查询速度如此之慢吗?

这是因为serializer,您可以通过使用
model.objects.values()
提高性能。如果使用serializer,这将非常快地返回相同的数据。

安装并查看查询时间和CPU时间。如果查询需要时间并且正在执行一些延迟加载检查&。

而不是使用
ListAPIView
尝试使用
ModelViewSet

为自己创建一个自定义视图集,该视图集仅继承
ListModelMixin

class ListModelViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    pass
现在将其扩展到视图集,并在那里编写
queryset

def get_queryset(self):
    Model.objects.all()
这不是一个可以加速事情的逻辑,因为它们最终都继承了相同的东西,但值得一试


如果这也不起作用。。。另一个可能的原因是5000个对象是一个相当大的数字。Shell不会一次返回所有对象。它对Model.objects.all()执行查询,但将对象的数量限制为20个,然后再加上这个…(剩余的元素被截断了…),因此我想这与web视图相比减少了时间,因为它必须将列表中的所有元素都包含在内。

我将查询集从Model.objects.all()更改为Model.objects.values()查询速度仍然很慢,查询时间是90毫秒,CPU时间是26000毫秒。另外,我不确定预回迁和选择相关在这里有多有用,因为所有字段都在同一个表中。是否要将所有5000个值都带到客户端?如果没有,则只对所需的项目进行分页和序列化。我们现在除了瞎猜之外别无选择。给我们看一看,给我们模型和序列化程序。@ArunGhosh我确实想把所有5000个值带到客户端。由于这些数据只有1mb左右,似乎有一种方法可以在不到15秒内从数据库传输到客户端。@KevinBrown真的吗?我认为我对模型和序列化程序的描述已经够直截了当了,但我已经更新了这个问题。@rawbeans这是。。。关于。通常,非查询问题是由于对数据进行额外处理的自定义模型和序列化程序造成的。但如果序列化程序和模型是空的(如示例所示),则需要拿出一个实际的Python分析器。