Джанго: как получить последний связанный объект - PullRequest
0 голосов
/ 03 марта 2019

Я работаю над оптимизацией запросов Django и пытаюсь получить последний связанный элемент.

Модели:

class Car(models.Model):
    title = models.CharField(max_length=255)

class CarTechnicalInspection(models.Model):
    car = models.ForeignKey(Car)
    date_to = models.DateField()

    class Meta:
        ordering = ['date_to', ]

Просмотр:

cars = Car.objects.all()
for car in cars:
    ti = car.cartechnicalinspection_set.last() #hit DB query for each car iteration!
    if ti and ti.date_to < timezone.now():
         #do something

КакАннотировать последний технический осмотр для каждого автомобиля без запроса БД для каждого автомобиля?Спасибо!

PS prefetch_related ('cartechnicalinspection_set') не работает

1 Ответ

0 голосов
/ 03 марта 2019

Итак, вам нужны все машины, которые date_to были раньше timezone.now(), что сейчас, и вам нужны date_to для этих автомобилей.

from django.db.models import Max

# Filter: cars with date_to less than timezone.now()
# Annotate: attach the greatest date_to as date_to to each car object.

cars = Car.objects.filter(cartechnicalinspection__date_to__lt=timezone.now()).annotate(date_to=Max('cartechnicalinspection__date_to'))

Теперь, если вы напечатаете их вот так:

for car in cars:
    print(car.date_to)

Вы получите date_to за каждый автомобиль, который date_to меньше timezone.now()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...