
💚머리말
디버깅하다가 생각나서 호다닥 쓰는 글.
블로그에 쓸 소재가 생겨서 신나서 들어왔다.
위의 사진은 '아하짤' 이라고 검색하면 나오는 사진인데,
아하 꼬마짤, 빨간 옷 입은 외국 남자애가 아하 하는 사진, 아하 보이, 아하 꼬맹이,
외국 꼬마 짤, 빨간옷입은남자애,아파 그렇구나 짤 등등으로 서치해도 나온다.
일종의 밈? 유행하는 이미지인데,
재밌기때문에 앞으로 에러 해결글에 첨부하고자한다.
💚에러메세지
movies.Movie.like users: (fields.E304) Reverse accessor for 'movies.Movie.like users' clashes with reverse accessor for 'movies.Movie.user'. HINT: Add or change a related_name argument to the definition for 'movies.Movie.like_users' or 'movies.Movie.user'.
movies.Movie.user: (fields.E304) Reverse accessor for 'movies.Movie.user' clashes with reverse accessor for 'movies.Movie.like_users'. HINT: Add or change a related_name argument to the definition for 'movies.Movie.user' or 'movies.Movie.like_users'.
$ python manage.py makemigrations
SystemCheckError: System check identified some issues:
ERRORS:
movies.Movie.like_users: (fields.E304) Reverse accessor
for 'movies.Movie.like_users' clashes with reverse accessor for 'movies.Movie.user'.
HINT: Add or change a related_name argument to the definition for 'movies.Movie.like_users' or 'movies.Movie.user'.
movies.Movie.user: (fields.E304) Reverse accessor for 'movies.Movie.user'
clashes with reverse accessor for 'movies.Movie.like_users'.
HINT: Add or change a related_name argument to the definition
for 'movies.Movie.user' or 'movies.Movie.like_users'.
💚해결법
python manage.py makemigrations 할때 발생하는 에러 중 하나이다.
본론만 먼저 이야기하면, model 에서 역접근자가 충돌해서 발생.
자주 발생하는 오류인지 힌트도 준다. related_name를 추가한다.
예를 들어보자.
class Movie(models.Model):
like_users = models.ManyToManyField(settings.AUTH_USER_MODEL)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=10)
content = models.TextField()
model.py 파일에 Movie 모델, 그리고 like_users 필드와 user 필드가 있다.
이때, like_users 필드와 user 필드가 역참조 관계에 있다.
역참조란 ForeignKey나 ManyToManyField와 같은 관계 필드를 통해 다른 모델을 참조하는 경우,
참조된 모델에서 참조하는 모델을 접근할 수 있는 기능을 말한다.
현재 like_users 필드와 user 필드가 동시에 역참조 관계에 있기 때문에,
속성이 어떤 필드를 가리키는지 알 수 없다.
따라서 이러한 충돌을 방지하기 위해 related_name이라는 속성을 사용한다.
related_name은 ForeignKey나 ManyToManyField와 같은 관계 필드의 옵션이다.
역참조 관계의 이름을 명시적으로 지정해주는 것.
예를 들자면,
like_users에 related_name="like_movies" 를 작성해준다.
related name 은 자유롭게 정하자.
수정
class Movie(models.Model):
like_users = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="like_movies")
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=10)
content = models.TextField()

'개발 > Django' 카테고리의 다른 글
| 만나면 좋은 친구, Django shell_plus (0) | 2023.04.17 |
|---|---|
| [django] python manage.py seed 테스트 데이터 자동생성 (0) | 2023.04.13 |