优化 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)
我正在 运行我自己的智能家居项目,在树莓派上使用 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)