Mysql 优化Django-ORM
我正在运行我自己的智能家居项目,在raspberry Pi上使用django后端和MySql。我有数据库中的SensorsData表,其中有数千条记录和来自传感器的数据。在我的REST API中,我使用的视图如下所示:Mysql 优化Django-ORM,mysql,django,optimization,raspberry-pi,django-queryset,Mysql,Django,Optimization,Raspberry Pi,Django Queryset,我正在运行我自己的智能家居项目,在raspberry Pi上使用django后端和MySql。我有数据库中的SensorsData表,其中有数千条记录和来自传感器的数据。在我的REST API中,我使用的视图如下所示: @api_view(['GET']) @permission_classes([IsAuthenticated]) def list_of_sensors_data(request, format=None): """ Get lis
@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)
我已经用蝗虫模拟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}"
传感器数据序列化程序:
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
对象。好消息是,您可以使用让Django在同一个查询中检索所有相关的传感器
s:
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def list_of_sensors_data(request, format=None):
sensors_data = SensorsData.objects.select_related('sensor')
serializer = SensorsDataSerializer(sensors_data, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
@api_视图(['GET']))
@权限\u类([IsAuthenticated])
def传感器数据列表(请求,格式=无):
传感器数据=传感器数据。对象。选择与传感器相关的('传感器')
序列化器=传感器数据序列化器(传感器数据,多个=真)
返回响应(serializer.data,status=status.HTTP\u 200\u OK)
仅适用于当前经过身份验证的用户?或者用户(?)您可以从请求中获取当前经过身份验证的用户。用户请共享SensorDataSerializer
和SensorData
模型。@Alvi15 ofc测试是为经过身份验证的用户运行的。@WillemVanOnsemdone@MichałZaręba:sensors_data=SensorsData.objects。选择_related('sensor')