TIL_231110_검색기능 수정

Sol Lee·2023년 11월 10일
0

오늘 최종프로젝트 1차 피드백을 받았다.
튜터님께 검색기능에 대해 질문했는데 이렇게 어렵게 안하고 related_name으로 접근하면 더 쉽게 구현 가능하다고 말하심.
어떻게 하는지 알려줄거라고 생각했는데 그렇게 까지는 안 알려줌쉽지않네

검색 기능

하고 보니 이렇게 간단할 수가 없었다.
서치해보니 fk로 연결되있 경우 __를 통해 다른 필드에 접근이 가능하다고 한다.

# models.py
class ArticleRecipe(models.Model):
 	...
    
class ArticleRecipeIngredients(models.Model):
  article_recipe = models.ForeignKey(
          ArticleRecipe,
          on_delete=models.CASCADE,
          related_name="recipe_ingredients",
      )
  ingredients = models.CharField(max_length=255)

위와 같이 필드를 정의했다고 할 때 검색 요청이 들어오면
ingredients에 keword가 포함된 ArticleRecipe목록을 반환해 주길 원할 경우 아래와 같이 접근하면 됨.

# views.py

ArticleRecipe.objects.filter(
         recipe_ingredients__ingredients__contains=keword)
         #related_name       #접근할 필드    #포함해라

그래서 수정한 코드가 아래임

def get(self, request):
        """검색된 재료 포함하는 레시피 구한 후 object 반환"""
        quart_string = request.GET["q"]
        ingredients = quart_string.split(",")
        recipes = []
        for i in range(len(ingredients)):
            if i < 1:
                recipes = ArticleRecipe.objects.filter(
                    recipe_ingredients__ingredients__contains=ingredients[i].strip(
                    )
                )
            else:
                recipes = recipes.filter(
                    recipe_ingredients__ingredients__contains=ingredients[i].strip(
                    )
                )
        serializer = RecipeSerializer(recipes, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

전에 작성한 애랑 비교하면 어이가 없음

# 얼탱X
def get(self, request):
        """ 검색된 재료 포함하는 레시피 구한 후 object 반환 """
        quart_string = request.GET['q'] # 파라미터값 추출
        ingredients = quart_string.split(",") # 파라미터 값에서 ,로 분리 -> 재료 목록
        recipe_ids = []
        compare_ids = []
        for i in range(len(ingredients)):
            ingredients_list = ArticleRecipeIngredients.objects.filter(
                ingredients__contains=ingredients[i].strip()) 
                # 재료 스키마의 ingredients필드에 ingredients[i]가 포함된 데이터 필터링
                # 공백이 포함되면 검색이 잘 안되서 앞뒤 공백제거도 해줌 .strip()
            for j in range(len(ingredients_list)):
                if i < 1:
                	# 첫번째 필터링 값은 바로 추가
                    # 레시피 아이디 append
                    recipe_ids.append(ingredients_list[j].article_recipe)
                else:
                	# 2번째부터는 앞선 레시피 아이디 리스트에 포함된 경우만 비교한 리스트에 저장
                    if ingredients_list[j].article_recipe in recipe_ids:
                        compare_ids.append(ingredients_list[j].article_recipe)
            if len(ingredients) > 1 and i > 0:
            	# 비교한 리스트를 앞선 레시피 리스트로 변경 비교 리스트 비우기
                recipe_ids = compare_ids
                compare_ids = []
        serializer = RecipeSerializer(recipe_ids, many=True)
        # 리스트 값들을 json화
        return Response(serializer.data, status=status.HTTP_200_OK)

솔직히 수정한 것도 또 수정할 부분이 있을지도 모르겠는데 머리 아파서 여기까지 해야겠음. 난 오늘 할 수 있는 만큼 해냈다...🫠

profile
직업: 개발자가 되고 싶은 오레오 집사

0개의 댓글