Framework/Django

MtoM 마이그레이션 오류(through 옵션)

JM Lee 2023. 6. 16. 17:01
728x90

ManytoManyField로 정의한 Article 테이블 내의 like, bookmark 모델은

users 앱의 User 모델과 MtoM의 관계를 가진다.

 

본래는 through = ' ' 를 설정해서 해결했지만

굳이 중간모델을 만들지 않아도? MtoM 관계를 만들면 알아서 중간모델을 만들어준다는 것을 알아내고

through를 없애고, related_name을 팀 코드 컨벤션에 맞춰서 고친 다음 마이그레이트를 해보았다.

 

Makemigrations는 이상 없이 잘 되었는데..

Migrate에서 달달하게 에러가 생겼다. 아랫줄은 에러코드의 핵심이다.

그럼 얘가 무엇을 의미하는지? 알아보았다.

ValueError: Cannot alter field articles.Article.like into articles.Article.like
# M2M(Many-to-Many) 필드에 대한 변경 제한
# 대신, M2M 관계를 변경하려면 중간 모델(through)을 통해 직접 관계를 수정해야 한다.

- they are not compatible types
# 호환되지 않는 타입이다!

(you cannot alter to or from M2M fields, or add or remove through= on M2M fields)
# 호환되지 않는 이유
# M2M 필드에 through 옵션을 사용하여 중간 모델을 정의한 경우,
# through 옵션을 추가하거나 제거하는 것은 허용되지 않는다.

 

원인이 명확하게 나타났다.

through 옵션은 함부로 붙이지 않는 걸로..!

 

DB에 데이터가 없었으니 다행이지 만약 서비스 단계였다면 나는 대역죄인이 되었겠지

결국 나는 DB를 싹 다 비우고 해결했다. 그게 제일 간편해서.

 

그럼 비우면 큰일날 경우에는 어떡하면 좋을까?

두 가지 경우가 있다.

 

MtoM 관계 필드를 수정할 경우

 : 중간 모델(through)을 통해 MtoM 관계를 변경해야 함. 변경 후에는 마이그레이션 적용 가능.

MtoM 관계 필드가 아닌 경우

 : 필드 유형을 변경하는 것이 가능한지 먼저 확인, 변경 가능한 필드가 있고 불가능한 필드가 있음

 : 필드 유형을 변경하지 못하는 경우에는 본래 필드 삭제 후 새로운 필드를 추가 (부분 삭제)

 

* 변경 가능한 필드 유형

  1. IntegerField: 정수 값을 저장하는 필드.
  2. CharField: 문자열 값을 저장하는 필드로, 최대 길이를 지정할 수 있다.
  3. TextField: 긴 텍스트 값을 저장하는 필드로, 최대 길이 제한이 없다.
  4. BooleanField: True 또는 False 값을 저장하는 필드.
  5. DateField: 날짜 값을 저장하는 필드.
  6. DateTimeField: 날짜와 시간 값을 저장하는 필드.
  7. FloatField: 부동 소수점 숫자 값을 저장하는 필드.
  8. DecimalField: 고정 소수점 숫자 값을 저장하는 필드.
  9. FileField: 파일을 저장하는 필드로, 실제 파일을 서버에 업로드하여 저장.
  10. ImageField: 이미지 파일을 저장하는 필드로, FileField의 서브클래스.

'Framework > Django' 카테고리의 다른 글

시리얼라이저 오버라이딩  (0) 2023.06.19
generics.ListCreateAPIView  (0) 2023.06.19
DRF Response()  (0) 2023.06.16
FBV 와 CBV 차이점  (0) 2023.06.16
DRF Docs 입문  (0) 2023.06.15