【发布时间】:2020-05-07 11:52:33
【问题描述】:
我需要列出我的所有设备。为此,我使用与减少查询量相关的预取。但是其中一个非常耗时。我想知道它是否不能变得更好。
我将从模型构造开始:我想要一个设备列表。
class Device(models.Model):
name = models.CharField(max_length=250, null=True, blank=True)
class GatewayDevice(models.Model):
gateway = models.ForeignKey(
Gateway, on_delete=models.CASCADE, related_name="devices"
)
device = models.ForeignKey(
Device, on_delete=models.CASCADE, related_name="gatewaydevices"
)
在实际代码中,设备模型更大,但该代码无关紧要。可以看到,一个设备有一些网关设备(网关和设备之间的模型)
所以在我的设备列表中,我想要每个设备,链接网关。
这是我的看法:
class AdminDeviceView(GenericAPIView):
def get_permissions(self):
return IsAuthenticated()
# noinspection PyMethodMayBeStatic
def get_serializer_class(self):
return AdminDeviceInfoSerializer
@swagger_auto_schema(
responses={
200: openapi.Response(
_("Successfully fetched all data from devices."),
AdminDeviceInfoSerializer,
)
}
)
def get(self, request):
"""
GET the data from all the devices.
"""
devices = (
Device.objects.filter()
.all()
.prefetch_related(
"site__users",
"software_update_history",
"supplier",
Prefetch(
"gatewaydevices",
queryset=GatewayDevice.objects.filter(end_date=None)
.order_by()
.distinct()
.prefetch_related("gateway"),
),
)
)
serializer_class = self.get_serializer_class()
serializer = serializer_class(devices, many=True)
devices_data = serializer.data
return Response(
{"total": devices.count(), "items": devices_data}, status=status.HTTP_200_OK
)
这是序列化程序中重要的部分:
@staticmethod
def get_gateway(device):
return (
GatewaySimpleSerializer(device.gatewaydevices.gateway).data
if device.gatewaydevices.gateway
else None
)
我尝试了不同的方法。这是当前的.. 现在我收到此错误:
AttributeError: 'RelatedManager' object has no attribute 'gateway'
【问题讨论】: