J, J Blog

[Django] prefetch_related 본문

Programming/Django

[Django] prefetch_related

J, J 2020. 1. 19. 01:16

우리가 쇼핑몰에서 주문을 할 때, 여러 상품들을 장바구니에 담아 구매요청을 하고 한 번에 결제를 한다.

이 때, '주문'과 '주문 상품' 은 일 대 다 관계를 갖게 된다. prefetch_related 는 이러한 데이터를 한 번에 가져올 때 유용하게 쓰인다. (성능상의 이점도 있으니 Django에서 서로 다른 테이블을 조인하여 가져오는 경우에는  prefetch_related 를 꼭 사용하자)

'주문' 모델을 'Order' 라 하고
'주문상품' 모델을 'OrderItem' 이라 한다.

# models.py

class Order(models.Model):
    created_date = models.DateTimeField(auto_now_add=True)

class OrderItem(models.Model):
    order = models.ForeignKey(
    	Order,
        on_delete=models.CASCADE,
        related_name='order_items'
	)  # prefetch_related(related_name)
    
    price = models.IntegerField(verbose_name='가격')
    quantity = models.PositiveIntegerField(default=1, verbose_name='수량')
# views.py

def my_views(request):
    orders = Order.objects.all().prefetch_related('order_items') # prefetch_related(related_name)
<!-- order_list.html -->

{% for order in orders %}
  {% for item in order.order_items.all %}
    <tr>
      <td>{{ order.id }}</td>
      <td>{{ order.created_date }}</td>
      <td>{{ item.price }} | {{ item.quantity }}</td>
    </tr>
  {% endfor %}
{% endfor %}

주석처리한 부분에 주의해 view를 작성 한다.