본문 바로가기
개발일지/Django

Django - HINT: Add or change a related_name argument to the definition for 'pybo.Question.voter' or 'pybo.Question.author'. - 해결

by 개발에정착하고싶다 2022. 12. 22.

흠.. 이쯤되면 일부러 저자분이 에러를 유도하시는건지 의문이 들정도로 에러가 많이 나온다.

물론 지금 이 상황은 의도적이였다고 써있다.

 

#1 상황

ERRORS:
pybo.Question.author: (fields.E304) Reverse accessor 'User.question_set' for 'pybo.Question.author' clashes with reverse accessor for 'pybo.Question.voter'.
        HINT: Add or change a related_name argument to the definition for 'pybo.Question.author' or 'pybo.Question.voter'.
pybo.Question.voter: (fields.E304) Reverse accessor 'User.question_set' for 'pybo.Question.voter' clashes with reverse accessor for 'pybo.Question.author'.
        HINT: Add or change a related_name argument to the definition for 'pybo.Question.voter' or 'pybo.Question.author'.

이런 에러가 떴다.

 

마지막 줄의 힌트에 보면

"관계되어있는 이름을 인수로 사용하고 있다. 

이것에 무언가를 추가하거나 지금 사용중인 것을 변경해서

정의해라

pybo.Question.voter 와

pybo.Question.author이다.


#2 정리

 

즉, pybo안의 같은 클래스 안에 속해있는 voter와 author는 같은 인수를 가지고 있으므로

어떻게든 중복되지 않게 해달라는 것이다.

 

author = models.ForeignKey(User, on_delete=models.CASCADE)

이게 author로써 가지는 인자중 User를 가지고 있고 (on_delete는 성질 자체가 인자라기보다는 인자를 어떻게 할건지에 대한 옵션개념이라 에러에 영향을 미치지는 않는것으로 알고있다)

 

voter = models.ManyToManyField(User)  # voter 추가

그리고 이것이 voter이다. 마찬가지로 인자를 User로 가지고 있다.


#3 해결

 

이를 해소하기 위해서 사용할 방법으로 제시 된 것은 related_name을 붙여주는 것이다.

딱히 어떤 기능인지는 설명이 없지만 개념적으로 봤을때 User는 사용해야겠고. 중복이 안된다는 것을 인지시켜 주기 위해서

related_name에 각각의 이름이 다른 태그를 만들어준다. 라는 개념으로 접근하면 맞는것 같다.

author = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name='author_question')
        
voter = models.ManyToManyField(
        User, related_name='voter_question')  # voter 추가

결과적으로는 이렇게 서로 related_name을 다르게 붙여줌으로 인해서 해결 되었다.