django | February 21, 2020
#data를 가져올 때 아래의 방식은 효율성이 매우 떨어진다.
drink1 = Product.objects.get(id=1) #<Product: Product object (1)>
SubCategory.objects.filter(id=drink1.category_id)[0].name
drink = Product.objects.get(id=1)
drink.sub_category.name #drink1의 sub_category라는 field의 name
_set
으로 가져온다.category = SubCategory.objects.get(id=1)
category.product_set.all()
# 카테고리1번을 보고 있는 역참조 관계에 있는 product들이 반환된다.(쿼리셋 형태)
related
방식으로 사용하면 우리 눈에는 보이지 않지만, 연결되는 각각의 테이블을 한번에 소환하기 때문에 효율이 높아진다.select_related
drink = Product.objects.select_related('sub_category').get(id=1)
drink.sub_category.name
SubCategory.objects.select_related('main_category')[1].main_category.name
prefetch_related
drink3 = SubCategory.objects.filter(id=1).prefetch_related("product_set")
drink3 ## 쿼리셋 형태: <QuerySet [<SubCategory: SubCategory object (1)>]>
drink3[0] ## 객체 형태 : <SubCategory: SubCategory object (1)>
drink3[0].name
drink3[0].product_set.values()
drink3[0].product_set.get(id=1).name ## 객체 형태
drink3[0].product_set.filter(id=1) ## 쿼리셋 형태
>>> a = Product.objects.all()
>>> print(a.query)
SELECT `products`.`id`, `products`.`main_category_id`, `products`.`sub_category_id`, `products`.`name`, `products`.`description`, `products`.`image` FROM `products`
>>> b = Product.objects.select_related('sub_category')
>>> print(b.query)
SELECT `products`.`id`, `products`.`main_category_id`, `products`.`sub_category_id`, `products`.`name`, `products`.`description`, `products`.`image`, `subcategories`.`id`, `subcategories`.`name`, `subcategories`.`main_category_id` FROM `products` LEFT OUTER JOIN `subcategories` ON (`products`.`sub_category_id` = `subcategories`.`id`)
>>> c = Product.objects.select_related('sub_category', 'main_category')
>>> print(c.query)
SELECT `products`.`id`, `products`.`main_category_id`, `products`.`sub_category_id`, `products`.`name`, `products`.`description`, `products`.`image`, `maincategories`.`id`, `maincategories`.`name`, `subcategories`.`id`, `subcategories`.`name`, `subcategories`.`main_category_id` FROM `products` LEFT OUTER JOIN `maincategories` ON (`products`.`main_category_id` = `maincategories`.`id`) LEFT OUTER JOIN `subcategories` ON (`products`.`sub_category_id` = `subcategories`.`id`)
>>> d = Product.objects.select_related('main_category')
>>> print(d.query)
SELECT `products`.`id`, `products`.`main_category_id`, `products`.`sub_category_id`, `products`.`name`, `products`.`description`, `products`.`image`, `maincategories`.`id`, `maincategories`.`name` FROM `products` LEFT OUTER JOIN `maincategories` ON (`products`.`main_category_id` = `maincategories`.`id`)
__
로 가져오는 방법>>> SubCategory.objects.filter(id=1).values('main_category__name')
<QuerySet [{'main_category__name': '음료'}]>
>>> SubCategory.objects.filter(id=1).values('product__name')
<QuerySet [{'product__name': '나이트로 바닐라 크림'}, {'product__name': '쇼콜라 클라우드'}, {'product__name': '돌체 콜드 브루'}, {'product__name': '레이즌 스콘'}, {'product__name': '녹차 머핀'}, {'product__name': '치즈 베이글'}]>