장고 QuerySet의 지연평가

from django.shortcuts import render, get_object_or_404
from .models import *


# Create your views here.
# 카테고리 페이지, URL로부터 category_slug를  찾아서 현재 어느 카테고리를 보여주는 것인지 판단,
# 선택한 카테고리가 없을 경우 전체 상품 목록 노출
def product_in_category(request, category_slug=None):
    current_category = None
    categories = Category.objects.all()
    products = Product.objects.filter(available_display=True)

    # products에서 filter를 여러번 실행하는데 실제로 데이터베이스에 질의는 딱 한번만 전달,
    # 장고의 QuerySet은 지연평가 방식을 사용하기 때문에 데이터를 질의하는 시점까지는 몇 번의 필터를 걸더라도 부하가 걸리지 않음
    if category_slug:
        current_category = get_object_or_404(Category, slug=category_slug)
        products = products.filter(category=current_category)

    print(products.query)
    return render(request, 'shop/list.html',
                  {'current_category': current_category, 'categories': categories, 'products': products})

장고 ORM에서는 지연평가를 사용해서 filter 메서드를 몇 번 호출하는 것에 상관없이 실제로 데이터베이스에 질의를 전달하는 것은 실제로 데이터를 질의하는 시점까지 늦추기때문에 부하를 줄일 수 있다.

하지만 이러한 장점을 생각없이 함부로 사용하다가는 문제가 발생할 가능성도 있기때문에 실제로 장고 ORM에서 쿼리를 어떻게 생성하여 데이터베이스에 쿼리를 전달하는지에 대한 명확한 이해가 필요하다.

https://daeguowl.tistory.com/171

좋은 웹페이지 즐겨찾기