【问题标题】:Optimizing django rest framework API优化django rest框架API
【发布时间】: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


【解决方案1】:

为什么要一次请求所有数据?

尝试使用分页来获取您只需要的数据,并在需要时请求更多数据。

【讨论】:

  • 此 API 将用于将数据获取到 matlab 或本地 pandas 环境中以进行进一步的数据分析。我还不知道确切的用例,所以我希望能够发送整个数据集。但是用户可能希望先过滤(因此过滤后端代码)然后只取回某些列(仍然需要实现这一点,并欢迎提出建议)。也欢迎其他有关传输大量数据的建议。
猜你喜欢
  • 2017-12-19
  • 2014-12-22
  • 2019-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 2020-05-15
相关资源
最近更新 更多