멘토님께 받은 과제는 이러했다.
지금 현재 진행중인 라카 프로젝트에서 립스틱 카테고리의 제품 여섯개의 이름과 url 정보를 가져오게 하는
view 를 작성하고 엔드 포인트까지 확인하는 과제였다.
기존에 했던 진행사항이 있고 데이터베이스에 제품 정보가 저장되어 있으므로 실제 웹 상에서 어떻게 데이터를 전달해주는지 눈으로 확인해봐야 되는 과정 이였다.
LIP 카테고리에 속해 있는 제품은 6종이 있고 이 제품 중 2가지는 SPECIAL EDITION 에 속하는 제품 이기도 했다.
일단 진도가 느린 나로써 느낀점 이라면 쿼리셋에 대한 ./manage.py shell 을 잘 다루고 이해해야 모델에 대한 뷰를 작성할 수 있다는 것을 몸으로 느꼈다.
뷰를 작성하기에 앞서서 shell 을 열어서 시도해 보았다.
데이터 베이스에 카테고리명과 제품 이름 등을 직접 넣어보았던 내 머리속으로는 립스틱 카테고리의 id 가 몇 번이고 그 카테고리의 product 들을 다 불러올 방법을 떠올리기 시작했다.
일단 테스트를 위해 from import 를 해와야 한다.
>>> from product.models import *
>>> Category.objects.get(name='lip')
<Category: Category object (2)>
>>> a = Category.objects.get(name='lip')
>>> a.name
'LIP'
>>> Category.objects.all()
<QuerySet [<Category: Category object (1)>, <Category: Category object (2)>, <Category: Category object (3)>, <Category: Category object (4)>, <Category: Category object (5)>, <Category: Category object (6)>, <Category: Category object (7)>]>
음 내가 원하는 것은 위의 정보가 아니다.
사진과 같이 (물론 백엔드 입장에서) 제품 여섯개의 이름 정보와 이미지 url 을 불러와야 한다.
어떻게 해야 할까?
일단 위의 코드와 별개로 확인 차원에서 다시 입력해 보았다.
>>> b = Category.objects.get(id=2)
>>> b.name
'LIP'
카테고리의 id 가 2번인 카테고리명은 바로 내가 찾는 'LIP' 이다.
Product.objects.filter(category=2)
<QuerySet [<Product: Product object (1)>, <Product: Product object (5)>,
<Product: Product object (10)>, <Product: Product object (6)>,
<Product: Product object (14)>, <Product: Product object (13)>]>
filter 로 특정한 요건의 값을 가져와 보기로 한다.
쿼리셋 Product object 여섯 개가 튀어나오는 것으로 봐서 저 객체들은 'LIP' 카테고리 내의 립 제품 들이다.
제품 product 에는 많은 컬럼들이 있으므로 그 중 제품명과 image url 의 값을 가져와 보기로 했다.
>>> a.values('name', 'outer_front_image_url')
<QuerySet [{'name': '워터리 쉬어 립스틱', 'outer_front_image_url':
'//laka.co.kr/web/product/medium/20200405/ae6730448aa6702be6503b190988845d.png'},
{'name': '스무스 매트 립틴트', 'outer_front_image_url':
'//laka.co.kr/web/product/medium/20200405/4561614d65ec32de34c2967616a3e435.png'},
{'name': '립스테리', 'outer_front_image_url':
'//laka.co.kr/web/product/medium/20200405/a1bef4ffaa9fa877b5eee38f31142791.png'},
{'name': '스무스 매트 립스틱', 'outer_front_image_url':
'//laka.co.kr/web/product/medium/20200405/118d26538dc528e8904971f59d8d72b1.png'},
{'name': '워터리 쉬어 립스틱 [스페셜 에디션]', 'outer_front_image_url':
'//laka.co.kr/web/product/medium/20200405/176e40fe862dcbdd652eeab7c6a3b98d.png'},
{'name': '스무스 매트 립틴트 [미니 에디션]', 'outer_front_image_url':
'//laka.co.kr/web/product/medium/20200405/2f19d4d1e384d2a62d1879f6f1e03462.png'}]>
방금 적용해본 사항으로 lipview.py 를 작성했다.
import json
from django.http import HttpResponse, JsonResponse
from django.views import View
from .models import Category, Product
class LipView(View):
def get(self, request):
lips_info = Product.objects.filter(category=2)
lip_img_urls=[{
'name' : lip.name,
'url' : lip.outer_front_image_url
} for lip in lips_info]
return JsonResponse({'data':lip_img_urls}, status=200)
product 앱 내에서의 url 경로는 아래와 같이 적용했다.
from django.urls import path
from .views import ProductView, CategoryView, DetailView
from .lipviews import LipView
urlpatterns = [
path('', ProductView.as_view()),
path('/category',CategoryView.as_view()),
path('/<int:product_id>',DetailView.as_view()),
path('/lip',LipView.as_view()),
]
main 폴더 내 urls.py 에서의 경로는 다음과 같다.
from django.urls import path, include
urlpatterns = [
path('member', include('member.urls')),
path('product',include('product.urls')),
path('store', include('store.urls')),
]
지금까지 만든 lipview 를 테스트하기 위한 엔드포인트는 아래와 같다.
http://127.0.0.1:8000/product/lip
그리고 런서버를 돌리는데 에러가 난다.
https://simpleisbetterthancomplex.com/tutorial/2016/07/26/how-to-reset-migrations.html
위 사이트를 참고하면 마이그레이션 초기화 및 생성이 가능하다.
그래도 복잡해질 땐 더 많이 구글링 해보게 되는 수밖에..
June 03, 2020 - 13:34:44
Django version 3.0.6, using settings 'laka.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Not Found: /
[03/Jun/2020 13:35:03] "GET / HTTP/1.1" 404 2131
[03/Jun/2020 13:35:30] "GET /product/lip HTTP/1.1" 200 970
[03/Jun/2020 13:38:58] "GET /product/lip HTTP/1.1" 200 970
200 코드를 확인했고 사이트에서는 아래 사진과 같이 원했던 모습으로 나온다.