Django's .annotate генерирует SQL-операцию для каждого экземпляра в queryset

У меня возникла проблема, когда моя аннотация для наименее связанных gross_price, кажется, вызывает n+1 количество запросов.

У меня есть две модели Product и ProductOption, которые выглядят следующим образом:

class Product(models.Model):
    ...

class ProductOption(models.Model):
    product = models.ForeignKey(Product, related_name="options", ...)
    gross_price = models.DecimalField(...)

В методе queryset моего менеджера, который перечисляет все продукты, у меня есть следующий код:

def annotate_lowest_price(self) -> QuerySet["models.Product"]:
    return self.prefetch_related("options").annotate(lowest_price=Min("options__gross_price")

И он используется в коде следующим образом:

def get_products_list():
    products = Product.objects.filter(...).annotate_lowest_price()
    ...
<

Метод выдает результат, как и ожидалось, но выполнение .explain() показывает, что он генерирует операцию SELECT MIN для каждого экземпляра в наборе запросов. Например, если у вас 10 товаров, то будет сделано 10 запросов:

Есть ли что-то очевидное, что я упускаю?

Вернуться на верх