Select_related
단순하게 말하면 특정 상황에서 (For 문) db에 여러 번 접근하여
불필요한 호출을 막기 위해 사용하는 것이다.
book_list = []
books = Book.objects.all()
for book in books:
book_list.append({
'id' : book.id,
'name' : 'book.name',
'writer' : book.writer.name # (1)
})
return JsonResponse({"message" :"SUCCESS"}, status=201})
이런 코드가 있다고 보자
이러면 (1)번에서 for문이 한 번 반복 될 때마다 book에있는 writer에 있는 db를 호출하여서
name울 가져올 것이다.
안에 데이터가 별로 없다면 크게 상관 없지만
데이터가 10000개만 넘어가도 10000번을 매 번 불러오는 것이므로
데이터 상으로나 속도 상으로나 엄청난 손해이다.
이를 방지하기 위해서
select_related를 통해 미리 필요한 정보를 호출한후 계속 호출할 필요 없이 거기서 사용하는 방법이 있다.
book_list = []
books = Book.objects.all().select_related("wirter") #(2)
for book in books:
book_list.append({
'id' : book.id,
'name' : 'book.name',
'writer' : book.writer.name # (1)
})
return JsonResponse({"message" :"SUCCESS"}, status=201})
첫 번째와 다른 점은 (2)번 부분에서 미리 select_related로 필요한 데이터 베이스를 미리 호출해주었기
때문에 아래에서는 더이상 for문을 돌 때마다 데이터베이스에 접근 하는 것이 아니라
이미 위에서 정의한 books에 의해서 1번의 호출로 코드를 수행할 수 있다.