Django: Использование «.first ()» в связанном наборе запросов запускает запросы, несмотря на «prefetch_related». Есть ли обходной путь? - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь оптимизировать некоторые наборы запросов в моем коде Django, используя prefetch_related.

Однако я понял, что если в другом месте кода функция набора запросов, такая как first, last, latest и т. Д., Вызывается для связанного набора запросов, запрос запускается независимо, фактически сводя на нет Оптимизация.

например.

class Client(models.Model):  
    # [...]

    @property
    def latest_order(self):
        self.orders.latest('ordered_at') # Order is a Many-to-one related obj

Использование Client.objects.prefetch_related('orders') не будет полезным, и latest_order будет по-прежнему запускать запрос для каждого Client.

Есть ли способ обойти это без изменения свойства модели Client? В противном случае, если это лучшее решение, как лучше сохранить функциональность latest_order?

Единственный способ, о котором я могу думать, - это просто реплицировать функциональность latest, но в памяти (через функцию sorted), однако это означает, что я теряю способность выполнять эту операцию на стороне базы данных, если она выгодно (например, я просто смотрю на 1 клиента с большим количеством заказов).

...