class ProductView(View):
def get(self, request):
try:
menu_name = request.GET.get('menu', None)
sort = request.GET.get('sort', '0')
sort_dict = {
'created_at' : 'created_at',
'price' : 'price',
'-price' : '-price'
}
if menu_name == '채소전체':
menu_name = '채소'
menus = Menu.objects.get(name=menu_name)
categories = Category.objects.filter(menu=menus).all()
products = Product.objects.filter(category__in=categories).all().order_by(sort_dict[sort])
results = []
for product_data in products:
results.append(
{
'name' : product_data.name,
'introduction' : product_data.introduction,
'price' : product_data.price,
'image' : [image.url for image in product_data.image_set.all()]
}
)
print(results)
return JsonResponse({'result':results}, status=201)
order_by()
코드를 사용했다."시도해 본 url과 방법들"
1)sort_dict
에key
값을 0 (따옴표 없이)으로 뒀을 때,
-> products/category\?category='쌈채소'&sort='0'
-> products/category\?category='쌈채소'&sort= 0
= 이번에도 둘다 작동하지 않음.Dictionary
의key
값에int
인 숫자값은 안되는 것처럼 보였음.2)
sort_dict
에key
값을 문자열 대신 '0' 으로 뒀을 때,
-> products/category\?category='쌈채소'&sort='0'
-> products/category\?category='쌈채소'&sort= 0
= 둘다 작동하지 않음.
== 2시간을 투자하고 나서야 우분투 에서는 Query parameter 의 값 사이에 '\' 를 추가해 줘야 한다는 것을 알았음(ㅇㄱㄹㅇ)3)
sort_dict
에key
값을 '0'으로 두고 '\'를 추가 했을 때,
-> products/category\?category='쌈채소'\&sort='0'
= 드디어 성공. 결론은 '\'와Dictionary
의key
값을 정확하게 설정 했어야 했던 것."사용하는 OS에 따라 방법이 다를 수 있다는 기본을 깨닫지 못하고 잘못 쌓아올린 코드탓만 했었다니"
[기본을 경시한 건물은 짓는 과정도 순탄치 않지만, 짓더라도 완전하지 못하다 ]
-> Menu :'채소(id=1)'
--> Category :'쌈채소(id=1)', '유기농채소(id=2)' [FK:menu_id=1]
---> Product : '깻잎(id=1)', '상추(id=2)' [FK:category_id=1],
'유기농깻잎(id=1)', '유기농상추(id=2)' [FK:category_id=2]
* 위와 같이 '채소' 버튼을 클릭하면 '채소'의 PK를 참조하는 모든 데이터의 정보가 출력되야한다.
default
로 첫 Menu의 모든 데이터를 불러올 수는 있었지만, 다른 카테고리로 넘어갔다가 전체보기를 눌렀을 때, 다시 모든 데이터를 불러와야 했다.if
였기에, 아래와 같은 코드블럭이 탄생했다.class ProductView(View):
def get(self, request):
try:
menu_name = request.GET.get('menu', None)
sort = request.GET.get('sort', '0')
sort_dict = {
'created_at' : 'created_at',
'price' : 'price',
'-price' : '-price'
}
if menu_name == '채소전체':
menu_name = '채소'
menus = Menu.objects.get(name=menu_name)
categories = Category.objects.filter(menu=menus).all()
products = Product.objects.filter(category__in=categories).all().order_by(sort_dict[sort])
results = []
elif menu_name == '샐러드전체':
menu_name = '샐러드'
menus = Menu.objects.get(name=menu_name)
categories = Category.objects.filter(menu=menus).all()
products = Product.objects.filter(category__in=categories).all().order_by(sort_dict[sort])
results = []
elif menu_name == '과일전체':
menu_name = '과일'
menus = Menu.objects.get(name=menu_name)
categories = Category.objects.filter(menu=menus).all()
products = Product.objects.filter(category__in=categories).all().order_by(sort_dict[sort])
results = []
elif menu_name == '간편식전체':
menu_name = '간편식'
menus = Menu.objects.get(name=menu_name)
categories = Category.objects.filter(menu=menus).all()
products = Product.objects.filter(category__in=categories).all().order_by(sort_dict[sort])
results = []
if menu_name:
menus = Menu.objects.get(name=menu_name)
categories = Category.objects.filter(menu=menus).all()
products = Product.objects.filter(category__in=categories).all().order_by(sort_dict[sort])
# products = Product.objects.filter(category__menu_id=menu_name).all()
results = []
for product_data in products:
results.append(
{
'name' : product_data.name,
'introduction' : product_data.introduction,
'price' : product_data.price,
'image' : [image.url for image in product_data.image_set.all()]
}
)
print(results)
return JsonResponse({'result':results}, status=201)
for
문 도 모든 if
문 아래에 중복으로 존재 했었고, 지나가다 코드를 구경온 지식인 동기가 도저히 참을 수 없다며 몇가지를 조언해주었다.(고마워요, 동기맨!)-> 처음 통신에서 일단 데이터들이 호출은 되었지만, 프론트쪽에서 url에 대한 문제점을 제기하였고, 이후 남은 시간을 메인페이지에 모두 쏟아부었다. 발목을 잡은것은 '전체보기' 탭에 대한 기능 문제였는데, 내가 생각한 방법은 '탭 마다 다른 url을 쓸 수 는 없는가?' 였고 프론트에서 나온 답변은 '가능은 하다, 다만 조금 복잡하다' 였었다. 이번에 팀으로 만났고 메인페이지를 담당했던 팀원이 독보적인 실력자라 가능하다고 말해줬던것 같다(우윳빛깔 마리아!). 아무튼, 나는 '그렇다면 전체보기용 기능을 따로 만들어야겠군' 이라고 생각했고 일일이 url에 다른 값을 넣어 작동하는 코드를 만들어 낸 것이다.
-> (추가) 이틀 후 라이브 코드리뷰를 마치고 난 뒤, 이 생각이 얼마나 어리석었는지 깨닫게 된 것은 안비밀.
도저히 참을 수 없댘ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ동기 누구에욬ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ누군지 알 것 같애