Я все еще работаю над оптимизацией запросов Django и борюсь с аннотациями внутри функции prefetch_related.
Модели:
class Car(models.Model):
title = models.CharField(max_length=255)
class RepeatServiceType(models.Model):
title = models.CharField(max_length=255)
cars = models.ManyToManyField(Car)
class RepeatService(models.Model):
service_type = models.ForeignKey(RepeatServiceType)
car = models.ForeignKey(Car)
mileage = models.BigIntegerField(default=0)
Просмотр:
cars = Car.objects.all().prefetch_related('repeatservicetype_set')
for car in cars:
services_types = car.repeatservicetype_set.all()\
.annotate(service_mileage=Max('repeatservice__mileage', filter=Q(repeatservice__car=car)))
#this hit DB query for each car iteration!
print(services_types.service_mileage)
I 'мы пытались предварительно выбрать что-то подобное, но не повезло:
prefetch_related(Prefetch('repeatservicetypes', queryset=Subquery(RepeatServiceType.objects.annotate(service_mileage=Max('repeatservice__mileage', filter=Q(repeatservice__car__pk=OuterRef('pk')))))))
Как комментировать внутри функции prefetch_related?
Django 2.0, при необходимости можно обновить до 2.1.
Спасибо!