我有三个模型,名为"Route","Place","Place".
class Route(models.Model):
place = models.ForeignKey(Place, on_delete=models.CASCADE, null=False, blank=False)
day = models.IntegerField(null=False, blank=False)
order = models.IntegerField(null=False, blank=False)
class Place(models.Model):
name = models.CharField(null=False, blank=False)
class PlaceImage(models.Model):
place = models.ForeignKey(Place, on_delete=models.CASCADE, null=False, blank=False)
image = models.ImageField(null=False, blank=False)
我想显示路由和地点的图像的基础上路由模型. 原始代码是…
# views.py
response_obj = (Route.objects.filter(day=day).prefetch_related("place__image").order_by('order'))
serializer = RouteSerializer(response_obj, many=True, context={'request': request})
# Part of RouteSerializer in serializers.py
placeImage = serializers.SerializerMethodField("get_placeImage_prefetch_related")
def get_placeImage_prefetch_related(self, group):
request = self.context.get('request')
image = group.place.image
return request.build_absolute_uri(image.first().image.url)
我有N +1个查询来获取像这样的位置图像
(0.000) SELECT "PLACE_IMAGE"."id", "PLACE_IMAGE"."place_id", "PLACE_IMAGE"."image", "PLACE_IMAGE"."created_at" FROM "PLACE_IMAGE" WHERE "PLACE_IMAGE"."place_id" = 80 ORDER BY "PLACE_IMAGE"."id" ASC LIMIT 1; args=(80,); alias=default
(0.000) SELECT "PLACE_IMAGE"."id", "PLACE_IMAGE"."place_id", "PLACE_IMAGE"."image", "PLACE_IMAGE"."created_at" FROM "PLACE_IMAGE" WHERE "PLACE_IMAGE"."place_id" = 79 ORDER BY "PLACE_IMAGE"."id" ASC LIMIT 1; args=(79,); alias=default
(0.000) SELECT "PLACE_IMAGE"."id", "PLACE_IMAGE"."place_id", "PLACE_IMAGE"."image", "PLACE_IMAGE"."created_at" FROM "PLACE_IMAGE" WHERE "PLACE_IMAGE"."place_id" = 78 ORDER BY "PLACE_IMAGE"."id" ASC LIMIT 1; args=(78,); alias=default
我如何才能解决这个n+1问题?
在www.example.com上,我试过
prefetch_related(Prefetch('place__image', queryset=PlaceImage.objects.all().only('image')))
但出现了错误.
AttributeError: 'PlaceImage' object has no attribute '_add_hints'