3์ผ์ฐจ์ ์ฌ๋ ธ๋ PR์ ๋ฐ์ ๋ฆฌ๋ทฐ ๋ด์ฉ์์
- ๊ฒฐ๊ณผ ๊ฐ์ ๋ฆฌ์คํธ๋ก ๊ฐ์ธ์ ๋ฐํํ๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
- product ๊ฐ์ฒด๋ง ์ฌ์ฉํด์ image_url์ ๊ฐ์ ธ์ฌ ์ ์๊ฒ ์์ ํด์ฃผ์ธ์.
1๋ฒ
: '{ }๊ฐ ํ ๊ฐ ์ด์์ผ ๊ฒฝ์ฐ, [ ]์ ๊ฐ์ธ์ ๋ฐํํ๊ณ
{ }๊ฐ ํ ๊ฐ์ผ ๊ฒฝ์ฐ, ๋ฐ๋ก { } ํํ๋ก ๋ฐํํ๋ค.'
๋ผ๋ ๊ฒ์ ๊ตฌ๊ธ๋ง์ ํตํด ํด๊ฒฐํ๊ณ ,
2๋ฒ
: ์ญ์ฐธ์กฐ์ ๊ฐ๋
์ด ๋ถ์กฑํ์ฌ ์ถ๊ฐ๋ก ๊ณต๋ถ ํ, product.image_set.all()
๋ก ์ฝ๋๋ฅผ ์์ ํ์๋ค.
์์ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์ํ์ฌ ์์ ๋ ์ฝ๋๋ ์๋(๐)์ ๊ฐ๋ค.
import json
from django.http import JsonResponse
from django.views import View
from products.models import Product
class ProductDetailView(View):
def get(self, request, product_id):
try:
product = Product.objects.get(id=product_id)
result = {
'name' : product.name,
'price' : product.price,
'brand' : product.brand,
'description' : product.description,
'thumbnail_image_url' : product.thumbnail_image_url,
'image_url' : product.image_set.all()[0].image_url
}
return JsonResponse({'message' : result}, status=200)
except Product.DoesNotExist:
return JsonResponse({'message' : 'PRODUCT_DOESNOT_EXIST'}, status=400)
์์ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์ ํ์,
์คํ ์์
๋ ๋ฐฐ์ด unit test
๋ฅผ ์์ฑํ๋ ๊ณผ์ ์์ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ๊ฒ ๋์๋ค.
์์ฑํ๋ product์ views.py๋ฅผ ์์ ํด์ผ ํ ์ ์ ๋ฐ๊ฒฌํ๊ฒ ๋ ๊ฒ์ด๋ค.
์์ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์ ์์ ํ๋ ์ฝ๋์์ product์ image๋ฅผ ํ ๊ฐ๋ง ๋ฐํํ๊ณ ์์๋ ๊ฒ์ด๋ค!!(์๋ ์ด๊ฒ ๋ฌด์จ์ผ์ด์ผ....?๐ฑ๐ฑ๐ฑ๐ฑ๐ฑ๐ฑ ์ด ์ํ์ unit test๋ฅผ ํ๋จ ๋ง์ธ๊ฐ....
๊ทธ๋ฆฌํ์ฌ!!
์ฌ๋ฌ ์ด๋ฏธ์ง๋ฅผ ๋ด์ ์ ์๊ฒ for๋ฌธ์ ์ฌ์ฉํ์ฌ ๋น list[ ]๋ฅผ ๋ง๋ค๊ณ ,
append() ํจ์๋ฅผ ์ด์ฉํ๋ ๋ก์ง์ ์์ฑํ๊ธฐ๋ก ํ๋ค.
(+ ์ถ๊ฐ๋ก list compresion์ผ๋ก ์
๋ฐ์ดํธ๋ฅผ ํด๋ณด๊ธฐ๋ก!)
์ฐ์ image๋ฅผ QuerySet์ image_url ์ด๋ผ๋ ๋ณ์์ ๋ด๋๋ค
image_url = product.image_set.all() #--> QuerySet ํํ
๋น list์ ๋ณ์์ธ image_result๋ฅผ ์ง์ ํด ์ฃผ์๋ค.
image_result = []
๊ทธ๋ฆฌ๊ณ ,
์ด์ for๋ฌธ์ ํตํด ๋น list์ append( )
ํจ์๋ฅผ ์ด์ฉํ์ฌ ๋ก์ง์ ์์ฑํ๋ฉด, ์๋์ ์ฝ๋(๋ณ๊ฒฝ ์ ๐)์ ๊ฐ๋ค.
import json
from django.http import JsonResponse
from django.views import View
from products.models import Product
class ProductDetailView(View):
def get(self, request, product_id):
try:
product = Product.objects.get(id=product_id)
image_url = product.image_set.all() #--> ์ฟผ๋ฆฌ์
[๋ฆฌ์คํธํํ]
image_result = []
for image in image_url: #--> ์ฟผ๋ฆฌ์
์์ ํ๊ฐ์ฉ ๊บผ๋ด๋, ๊ทธ๋ฅ ๊ฐ์ฒด๊ฐ ๊บผ๋ด์ ธ๋์ด...
image_result.append(image)
์์์ ํ์ธ์ ํด๋ณธ ๊ฒฐ๊ณผ,
image_url
์ QuerySet
type์ผ๋ก ๋์ค๊ณ
for๋ฌธ์ ํตํด ํ๋์ฉ ๊บผ๋ด์จ ๊ฒ์ ๊ฐ์ฒด์ด๋ฉฐ
์์ ๋ด๊ฐ ์์ฑํ ์ฝ๋๋ image_result
๋ณ์์ ๊ณง๋ฐ๋ก ๊ฐ์ฒด
๋ฅผ ๋ด์ ์ํฉ์ด ๋๊ฒ์ด๋ค.
Json
์ ๊ฐ์ฒด๋ ์ฟผ๋ฆฌ์ ์ type๋ก๋ ๋ณํ์ํฌ ์ ์๊ธฐ๋๋ฌธ์,
for๋ฌธ์ ํตํด์ image๋ฅผ Json์ด ๋ณํ์ด ๊ฐ๋ฅํ[ ]
or{ }
ํํ๋ก ๋ง๋ค์ด์ค์ผ ํ๋ค๋๊ฒ!
์์ ๊ฐ์ ์ฝ๋๋ก๋ for๋ฌธ์ ์์ฑํ์ง๋ง,
Json Serisable Error
๊ฐ ๋ฐ์ํ๊ฒ ๋ ๊ฒ์ด๋ค.
๊ทธ๋์,
append( )
ํจ์๋ฅผ ์ด์ฉํ์ฌ ๋น list์ ๋ฃ์ด์ฃผ๊ณ ์ถ์ ๊ฐ์,
ํ ๊ฐ์ฉ ๋์จ ๊ทธ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ image_url
์ด๋ผ๋ ์ ๋ณด๋ผ๋ ๊ฒ์ด๋ค.
์์ ์ฌํญ์ ๋ฐ์ํ์ฌ,
์์ ํ ์ฝ๋(์์ ํ๐)๋ ์๋์ ๊ฐ๋ค.
import json
from django.http import JsonResponse
from django.views import View
from products.models import Product
class ProductDetailView(View):
def get(self, request, product_id):
try:
product = Product.objects.get(id=product_id)
image_url = product.image_set.all() #--> ์ฟผ๋ฆฌ์
[๋ฆฌ์คํธํํ]
image_result = []
for image in image_url: #--> ์ฟผ๋ฆฌ์
์์ ํ๊ฐ์ฉ ๊บผ๋ด๋, ๊ทธ๋ฅ ๊ฐ์ฒด๊ฐ ๊บผ๋ด์ ธ๋์ด...
image_result.append(image.image_url)
์์ ์ฝ๋์ ์ถ๊ฐ๋ก
๋ฉํ ๋์
๋๊ตฌ๋ ๋ณ์๋ช ๋ง ๋ณด๊ณ ๋
ํด๋น ๋ณ์์ ์ด๋ค ๊ฐ์ด ๋ด๊ฒผ๋์ง ์ ์ ์๊ฒ
๋ณ์๋ช ์ ์์ ํ๋๊ฒ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ผ๋ ์กฐ์ธ์ ๋ฐ์,
`image_url` --> `images` `image_result` --> `image_list`
์๋(๐)์ ์ฌ์ง๊ณผ ์ฝ๋๊ฐ ๋ณ์๋ช
์ ๋ํ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์ํ ๊ฒ์ด๋ค.
import json
from django.http import JsonResponse
from django.views import View
from products.models import Product
class ProductDetailView(View):
def get(self, request, product_id):
try:
product = Product.objects.get(id=product_id)
images = product.image_set.all() #--> ์ฟผ๋ฆฌ์
[๋ฆฌ์คํธํํ]
image_list = []
for image in images: #--> ์ฟผ๋ฆฌ์
์์ ํ๊ฐ์ฉ ๊บผ๋ด๋, ๊ทธ๋ฅ ๊ฐ์ฒด๊ฐ ๊บผ๋ด์ ธ๋์ด...
image_list.append(image.image_url)
result = {
'name' : product.name,
'price' : product.price,
'brand' : product.brand,
'description' : product.description,
'thumbnail_image_url' : product.thumbnail_image_url,
'image_url' : image_list
}
return JsonResponse({'message' : result}, status=200)
except Product.DoesNotExist:
return JsonResponse({'message' : 'PRODUCT_DOESNOT_EXIST'}, status=400)
product datail view๋ฅผ ์์ฑ ์๋ฃ ํ์,
๋ค์ unit test
๋ฅผ ์งํํ๊ฒ ๋์๋ค.
ํด๋น unit test code๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ ๋ชจ๋ ์ ๋ฆฌํ์ง ๋ชปํ์ง๋ง,
๋ด๊ฐ ์ค์ํ ๋ถ๋ถ, ๊ณผ์ ์ ๋ฐ์ํ ์๋ฌ, ํด๊ฒฐ?์ ๋ํ ์์ฑ์ ๋์ ๋ฒจ๋ก๊ทธ ๋งํฌ(๐)๋ก ์ฒจ๋ถํ๋๋ก ํ๊ฒ ๋ค.
๐ unit test ์์ฑ ๊ณผ์ ๊ธฐ๋ก ๐
<์ ๊น... ๋์ ์ด๋ ๋ง...>
uni test code๋ฅผ ์์ฑํ๋ฉด์, ์ด๋ฏธ์ง์ ๋ํ for๋ฌธ์ ๋๋ฆฌ๋ ์ด์ ๋ ์๊ฒ ๋์๋ค.
์์์ ๋ฒจ๋ก๊ทธ๋ฅผ ์์ฑํ๋ฉด์ ์ค๋ช
ํ์ง๋ง,
all()์ QuerySet type์ด๊ธฐ ๋๋ฌธ์ json์ด ๋ณํ์ ํ ์ ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ for๋ฌธ์ ํตํด์ ๊ฐ์ฒด(์ธ์คํด์ค)๋ฅผ Json์ด ๋ณํํ ์ ์๋ ํํ์ธ list๋ dictionary type์ผ๋ก ๋ฐ๊ฟ์ค์ผ ํ๋ค๋ ๊ฒ์ ๋ฐฐ์ ๋ค.