کد زیر چند Hit دیتابیس دارد؟
1 2 |
>>> pizzas = Pizza.objects.prefetch_related('toppings') >>> [list(pizza.toppings.filter(spicy=True)) for pizza in pizzas] |
همچنان N+2!!!
حتی با وجود اینکه از prefetch_related استفاده شده است دوباره در داخل حلقه به N دسترسی مجدد به دیتابیس وجود دارد. چرا که prefetch_related بالا برای Pizaa.objects.all بوده ولی پایین از filter استفاده کردیم که ORM جنگو دسترسی بالایی را در نظر نمیگیرد و دوباره query میزند. اتفاقا بدتره چرا که یه query بالا هم اضافی هست. راه حل زیر درست میشه:
1 |
Pizza.objects.filter(spicy=True).prefetch_related('toppings') |
یا
1 |
Pizza.objects.prefetch_related('toppings').filter(spicy=True) |