【发布时间】:2021-06-17 17:29:03
【问题描述】:
我创建了一个 API 来从数据库中获取所有数据。有一个“部署”表和一个相关表“传感器”,其中有一个引用部署的外键,一对多的关系。序列化程序创建一个嵌套的 JSON。目前,如果我请求所有记录,则返回数据大约需要 45 秒(17,000 行 JSON)。
如何分析我的 Django 应用程序以确定瓶颈是什么?
有什么建议可以改进以加快速度吗?或者这是否已经达到预期效果?
models.py
class deployment(models.Model):
ADD_DATE = models.DateTimeField() #creation of record in db
#...30 more fields....
class sensor(models.Model):
DEPLOYMENT = models.ForeignKey(deployment, related_name='sensors', on_delete=models.CASCADE)
ADD_DATE = models.DateTimeField() #creation of record in db
SENSOR = models.ForeignKey(sensor_types, to_field="VALUE", max_length=50, on_delete=models.PROTECT)
#...5 more foreign key fields...
views.py
class GetCrtMetadata(generics.ListAPIView): #Read only
serializer_class = CurrentDeploymentSerializer
queryset=deployment.objects.all().prefetch_related("sensors")
filter_backends = [DjangoFilterBackend]
filter_fields = [field.name for field in deployment._meta.fields]
部署应用序列化器.py
class CurrentDeploymentSerializer(serializers.ModelSerializer):
#Returns deployment with sensors
sensors = SensorSerializer(many=True)
class Meta:
model = deployment
fields = [field.name for field in deployment._meta.fields]
fields.extend(['sensors'])
read_only_fields = fields
传感器应用序列化程序.py
class SensorSerializer(serializers.ModelSerializer):
class Meta:
model = sensor
fields = [field.name for field in sensor._meta.fields]
【问题讨论】:
-
您可以尝试手动准备 json(纯列表和字典,不使用 drf 序列化程序),这可能会接近最佳性能。您还可以检查实际的 sql 以确保您没有进行额外的查询。您可以使用 cProfile 来识别慢速部分。而且,是的,服务大 json 通常会很慢,所以如果你能以某种方式对其进行分页会很好
-
谢谢,我会研究一下分页和 cProfile
标签: django django-rest-framework