LAKA_PROJECT lipview.py 만들기

.·2020년 6월 3일
0

Coding

목록 보기
29/33

멘토님께 받은 과제는 이러했다.
지금 현재 진행중인 라카 프로젝트에서 립스틱 카테고리의 제품 여섯개의 이름과 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 코드를 확인했고 사이트에서는 아래 사진과 같이 원했던 모습으로 나온다.

profile
.

0개의 댓글