TIL_231011_‼️ERROR‼️ 'ManyRelatedManager' object is not iterable

Sol Lee·2023년 10월 11일
0

팀 프로젝트: 오늘부터 올해말까지 목표설정하고 기록하는 웹서비스

유저별 게시글 페이지를 볼 때

📌 2023년, 00님은
'#회사원되기' 를 위해 000일동안 노력중입니다!
'#재난에서살아남을수있는체력' 을 위해 000일동안 노력중입니다!

위 정보를 전달할 get api를 작성해보자

tag의 urls.py

urlpatterns = [
		...
    path('<str:nickname>/', views.TagCalView.as_view()),
]

tag의 views.py

class TagCalView(APIView):
    def get(self, request, nickname):
        """ 유저의 목표태그와 달성률 요청 """
        user = User.objects.get(nickname=nickname)
        tags = user.tag_ids.all() # 유저가 설정한 목표 태그
        tag_data =[]
        for i in tags:
			# 유저가 작성한 게시글중 해당 태그를 가진 것만 필터링
            tag_articles = Article.objects.filter(tag_id=i.id, user_id=user.pk) 
            tag_data.append({i.id: i.tag_name,
                             "tag_articles": len(tag_articles)})
        return Response(tag_data, status=status.HTTP_200_OK)

시리얼라이저 사용해보려고 했는데 실패했다.

시리얼라이저에 tag_ids 값을 담아 보내고 유저가 작성한 게시글중 해당 태그를 가진 것만 필터링 하려고 했는데 해당 user 정보를 어떻게 같이 보내줘야 될 지 모르겠다.

tag_ids값만 가져가서 해당 유저글만이 아닌 태그를 가진 글 전부가 가져와짐

분명 방법이 있을 것 같은데 뭐라 검색해야할 지 모르겠다.
일단 쉬운 방식으로 했다.

이전에 전체 태그정보 api 작성할 때, 프론트엔드분이 원하는 형식이 있어서 이번에는 별도 요청은 없었지만 일단 그 형식 + 새로운 정보 담아서 보내도록 작성했다.

{id: tag_name, “tag_articles”: tag_articles}

‼️ERROR‼️ 'ManyRelatedManager' object is not iterable

처음에 m2m필드를 바로 for문으로 돌리려고 했더니 위 에러가 났다.

...
tags = user.tag_ids
for i in tags:
...

검색해보니 m2m필드는 객체로 반환되어서 all()을 붙여 쿼리셋으로 바꿔줘야한다고 한다.

tags = user.tag_ids.all()

생각해보니 게시물 숫자 = 작성일이 되려면 하루에 한 태그로 한 개만 작성하도록 해야겠는걸 이건 내일하자

분명 해야할 게 더 있는거 같은데 정리가 잘 안되서 답답하다.

참고

TypeError: ManyRelatedManager object is not iterable

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

0개의 댓글