1차 프로젝트 - Code Review

soojung61·2일 전
0

project

목록 보기
2/3

1차 프로젝트 중 기억에 남는 코드를 리뷰해보려 합니다.

컨버스 홈페이지를 보면 왼쪽에 제품 필터링하는 부분이 있습니다.

저 필터는 신발 전체리스트, 카테고리별 리스트, 검색 후의 리스트에서도 전부 가능합니다.
처음에는 신발 전체리스트, 카테고리별 리스트, 검색어가 존재할 때의 조건을 이용해서 if 문으로 그때 그때 ShoeColor 를 filter 해줬습니다. 그렇게 하다보니 prefetch_related 이 부분은 항상 반복되었고, 코드가 너무 길어졌습니다...😂

그래서! 반복되는 부분을 줄이고자, request에 들어오는 query string과 url parameter를 전처리 해줬습니다!

url parameter

신발 전체리스트 일경우 url parameter로 shoes 가 들어오고, 그외에는 카테고리 이름이 들어옵니다.
그래서 url parameter가 shoes일 경우

category_name = ShoeCategory.objects.all().values_list("name", flat=True)

category_name 으로 ShoeCategory의 목록 전체를 list에 담아주었습니다.
그 후 ShoeColor를 filter할때 ShoeColor에 연결된 shoe__shoe_category__name__in=[cateogyr_name] 를 이용해 filtering 했습니다.

query string

제품을 검색한 경우 query string 으로 ?name=원스타 이렇게 들어옵니다. 그 name이 없을 경우 '' 으로 지정해주어 모든 제품을 포함하게 했습니다.

필터링 할 때에는 query string으로 color, type, gender, size 키값으로 들어와서, 있는 경우 list에 담아주었고, 없는 경우는 filter 객체를 모두 리스트에 담아서 필터링 했습니다.

shoes = ShoeColor.objects.filter(
    shoe__shoe_category__name__in        = [category_name],
    shoe__detail__name__contains         = namefilter,
    color__color_category__name__in      = colorfilter,
    shoe__type_filter__name__in          = typefilter,
    shoe__gender_segmentation__name__in  = genderfilter,
    shoecolorsize__size__name__in        = sizefilter
).prefetch_related(
    'shoe',
    'shoe__detail',
    'image',
    'subimage_set',
    'shoe__gender_segmentation',
    'shoe__type_filter',
    'shoecolorsize_set__size'
).distinct()

프로젝트 이후 공부하다보니 장고 orm인 Q를 이용하면 add 를 이용하여 원할때 query를 추가할 수 있다하여, 추후 코드를 더 수정할 계획입니다.

profile
개발자 공부중입니다 :)

0개의 댓글