优化 Django ORM

Optimization Django ORM

我正在 运行我自己的智能家居项目,在树莓派上使用 django 后端和 MySql Pi.I在数据库中有 SensorsData table,有数千条记录与来自传感器的数据。在我的 REST API 中,我使用的视图如下所示:

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def list_of_sensors_data(request, format=None):
    """
    Get list of all sensors data, only for authenticated users
    :param request: GET
    :return: list of all sensors data if ok http 200 response
    """
    sensors_data = SensorsData.objects.all()
    serializer = SensorsDataSerializer(sensors_data, many=True)
    return Response(serializer.data, status=status.HTTP_200_OK)

我已经 运行 使用 Locust 模拟 10 个用户尝试使用我的端点的性能测试。一段时间后,Django 使用此特定端点不断返回 504 超时。我的问题是,如何优化这个查询集?我需要让它更快。

编辑传感器数据模型:

class SensorsData(models.Model):
    sensor = models.ForeignKey(Sensors, on_delete=models.CASCADE)
    delivery_time = models.DateTimeField(auto_now_add=True)
    sensor_data = models.CharField(max_length=20)

    class Meta:
        verbose_name = "Sensor data"
        verbose_name_plural = "Sensors data"

    def __str__(self):
        return f"{self.sensor.id}: {self.sensor.name}"

SensorsData 序列化程序:

class SensorsDataSerializer(serializers.ModelSerializer):
    sensor = serializers.SlugRelatedField(read_only=False, many=False, slug_field='name', queryset=Sensors.objects.all())

    class Meta:
        model = SensorsData
        fields = ("sensor", "delivery_time", "sensor_data")

这将引入一个 N+1 问题,对于每个 SensorsData 对象,您将进行额外的查询以获取相关的 Sensor 对象。好消息是,您可以使用 .select_related(…) [Django-doc] 让 Django 在同一个查询中检索所有相关的 sensor

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def list_of_sensors_data(request, format=None):
    sensors_data = SensorsData.objects<b>.select_related('sensor')</b>
    serializer = SensorsDataSerializer(sensors_data, many=True)
    return Response(serializer.data, status=status.HTTP_200_OK)