개발/Django

[django] fields.E304 에러 해결 ( 역참조, related_name, 유저모델 커스터마이징, Migration errors )

밥공블 2023. 4. 12. 15:41
반응형

 

에러를 해결해보자

💚머리말

디버깅하다가 생각나서 호다닥 쓰는 글.

블로그에 쓸 소재가 생겨서 신나서 들어왔다.

 

위의 사진은 '아하짤' 이라고 검색하면 나오는 사진인데,

아하 꼬마짤, 빨간 옷 입은 외국 남자애가 아하 하는 사진, 아하 보이, 아하 꼬맹이, 

외국 꼬마 짤, 빨간옷입은남자애,아파 그렇구나 짤 등등으로 서치해도 나온다.

 

일종의 밈? 유행하는 이미지인데,

재밌기때문에 앞으로 에러 해결글에 첨부하고자한다.

 

 

💚에러메세지

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()