오늘 최종프로젝트 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)
솔직히 수정한 것도 또 수정할 부분이 있을지도 모르겠는데 머리 아파서 여기까지 해야겠음. 난 오늘 할 수 있는 만큼 해냈다...🫠