Django: как аннотировать внутри prefetch_related - PullRequest
0 голосов
/ 10 марта 2019

Я все еще работаю над оптимизацией запросов 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.

Спасибо!

...