AMAD's Tech blog

ManyRelatedManager object has no attribute

by AMAD

 

에러와 오류에 지친 여러분께 심심한 위로의 뜻을 전합니다. 

아울러 해당 포스팅은 개발 실력 향상을 위한 학습형 포스팅과는 성격이 다르다는 점 밝힙니다. 원인과 결과, 해당 오류의 해결을 위한 짤막한 글로 구성되어 있다는 것을 알려드리며, 모쪼록 이 페이지가 여러분의 마지막 검색이 되길 기원합니다.

 

 

에러 문구

 

many to many field를 적용한 테이블

요약: Actor클래스(actors테이블) 에서 many to many field를 걸어 movie를 정참조

foreign key를 이용하여 A테이블에서 B테이블을 정참조

여기에서 A테이블은 actors 테이블이고 B테이블은 movies테이블이다.

 

이해를 돕기 위한 Foreign key 테이블

요약: dogs테이블에서 foreign key로 owners테이블을 정참조

장고에서는 정참조 하고있는 테이블의 속성을 불러올때는 간단히 불러올 수 있다.
정참조 하고있는 클래스명을 소문자로 적어주고 그 뒤에 .체이닝으로 속성을 불러올 수 있다.

 

이해를 돕기 위한 스크린샷

위 코드를 해석하면 다음과 같다.

 

1. dogs라는 변수에 Dog테이블의 모든 값을 쿼리셋으로 불러와서 담아준다.
2.쿼리셋의 0번 인덱스(첫번째를 뜻한다.)에서 정참조하고있는 테이블(owner)의 name정보를 .체이닝으로 가져온다.
3.가져온 정보를 보여준다.

 

여기서 주의할 사항은 정참조 하고있는 테이블의 클래스명(Owner)으로 체이닝을 시켜주는데
단, 클래스명 그대로 첫글자를 대문자로 체이닝 하는게 아니고 전부 소문자로 바꿔 owner로 체이닝을 해줘야 한다.

이건 그냥 장고를 만든 사람이 이렇게 만들었기때문에 우리가 따라야 할 장고의 문법(?)이라고 할 수 있다.

 

나는 foreign key도 이렇게 참조하고 있는 테이블을 체이닝 하니깐 many to many field도 동일 할 것이라고 생각했다.

하지만,

위의 dog에서 owner테이블에 접근하는 방식과 동일하게 접근했지만 AttributeError 발생

요약: many to many field로 정참조를 해주어도 foreign Key로 관계를 맺어준 테이블처럼 체이닝하는것은 불가능

 

그래서 한번더 all메소드 이용해서 쿼리셋으로 불러온다음 체이닝 가능

 

블로그의 정보

성장 하고 싶은 개발자

AMAD

활동하기