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 запросов:
Есть ли что-то очевидное, что я упускаю?