250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 호이스팅
- docker
- 스코프
- TypeError: this.boardRepository.createBoard is not a function
- 실행 컨텍스트
- pm2
- JWT
- django westagram
- 장고초기세팅
- wecode
- javascript
- rebase
- OSI7계층
- crud2
- typescript
- on_delete
- Jest
- 프로미스
- westagram
- CORS
- nodeJS
- Django
- status code
- manytomanyfield
- bcrypt
- async/await
- 트랜잭션
- node
- 노드
- 자바스크립트
Archives
- Today
- Total
될때까지
((TURTLE HOME)) 4일차 : SubCategoryView 본문
728x90
첫번째 시도
- 사용자로부터 category_id를 전달받는다.
- SubCategory 객체들 중에서 category_id가 일치하는 객체를 찾는다.
- get()은 객체로 반환하고, 객체가 존재하지 않는 경우에 따른 객체.DoesNotExist에러를 일으킨다.
- filter()는 쿼리셋에 담아 반환하기 때문에 데이터가 비어있으면 빈 쿼리셋을 반환한다. 그래서 비어있을 때(없을 때)에 대해 핸들링 해야한다.
- SubCategory중 category_id가 일치하는 객체가 존재한다면, 해당 객체의 정보들을 담아 json형식으로 보내주면 된다.
# Create your views here.
from django.http import JsonResponse
from django.views import View
from products.models import SubCategory
class SubCategoryView(View):
def get(self, request, category_id): # 클라이언트에서 값을 보내주면 그 값을 받는 자리를 만들어줘야한다
# 클라이언트가 누른 카테고리 값 잘 들어왔나 확인하기
# print(category_id)
subcategories = SubCategory.objects.filter(category_id=category_id)
result = []
# 클라이언트가 누른 카테고리의 값이 서브카테고리 객체중에 없다면 => 예외처리해줘야한다 없는 데이터에 접근한다.
if not subcategories:
return JsonResponse({'message':'Subcategory does not exist.'}, status=401)
# 클라이언트가 누른 카테고리의 값이 서브카테고리 객체중에 있으면 아래 코드를 실행
for subcategory in subcategories:
result.append({
'id' : subcategory.id,
'name' : subcategory.name,
'image_url' : subcategory.image_url,
'category_id': category_id,
})
return JsonResponse({'message':result}, status=200)
# zara>urls.py
from django.urls import path, include
from products.views import SubCategoryView
urlpatterns = [
path("categories/<int:category_id>/subcategories", SubCategoryView.as_view())
]
두번째 시도(with 멘토님)
JsonResponse 시 message는 이 응답이 어떤 응답인지에 대한 설명글을 적을 때 사용하고, 실제 데이터를 담아 보내줄때는 data나 result라는 키워드를 사용하는 게 적합하다.
from django.http import JsonResponse
from django.views import View
from products.models import Product, SubCategory
# Create your views here.
class SubCategoryView(View):
def get(self, request, category_id):
subcategories = SubCategory.objects.filter(category_id=category_id)
if not subcategories:
return JsonResponse({'message':'Subcategory does not exist.'}, status=400)
result = [{
'id' : subcategory.id,
'name' : subcategory.name,
'image_url' : subcategory.image_url,
'category_id': category_id } for subcategory in subcategories]
return JsonResponse({'result':result}, status=200)
# 어려웠던 점
- users 앱과 products앱 2가지를 만들어서 자라홈을 구현하고 있었다. SubCategoryView를 구현할 때, 클라이언트로부터 대카테고리의 id값을 어떻게 받아올 까 고민했다. 찾아봤더니 클라이언트로부터 url을 받을 때 전달되는 id값을 변수에 담고, SubCategoryView에 get메소드 요청 시 전달해주면 됐다.
- .gitignore에 올렸는데도 파일이 추적이 되고 있네? -> 해결방법
- shell로 CSV를 집어넣는 데 조회하면 있는 컬럼인데 왜 없는 컬럼이라고 뜨지? -> 해결방법
- products앱 안에서 SubCategoryView를 작업하고 있었다. 처음 url주소를 '/products'로 끊었기 때문에 여기서 계속 작업한다면 주소가 '/products/subcategories/<int:category_id>'이 된다.
- 내 생각 RESTful한 API를 위해서는 '/categories/<int:category_id>/subcategories' 로 만들고 싶었다. 방법이 없을까 고민했는데 처음 url주소를 세팅할 때, 앱이름.urls로 연결하지 않고 바로 뷰로 연결할 수 있다고 해서 해결했다. 즉, url 주소를 프로젝트단에서도 뷰로 바로 연결할 수 있었다.
728x90
'프로젝트 > wecode1차 : TURTLE-HOME' 카테고리의 다른 글
((TURTLE HOME)) 6일차 : ProductListView 1/2 (0) | 2022.07.23 |
---|---|
((TURTLE HOME)) 5일차 : ProductDetailView (0) | 2022.07.22 |
((TURTLE HOME)) 3일차 : CSV파일 생성 및 DB에 적용하기 (0) | 2022.07.20 |
((TURTLE HOME)) 2일차 : products app, 상품 모델링 (0) | 2022.07.19 |
((TURTLE HOME)) 1일차 : 프로젝트 팀명 정하기, 파트 나누기, 초기세팅, ERD (0) | 2022.07.18 |