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 관계 필드가 아닌 경우
: 필드 유형을 변경하는 것이 가능한지 먼저 확인, 변경 가능한 필드가 있고 불가능한 필드가 있음
: 필드 유형을 변경하지 못하는 경우에는 본래 필드 삭제 후 새로운 필드를 추가 (부분 삭제)
* 변경 가능한 필드 유형
- IntegerField: 정수 값을 저장하는 필드.
- CharField: 문자열 값을 저장하는 필드로, 최대 길이를 지정할 수 있다.
- TextField: 긴 텍스트 값을 저장하는 필드로, 최대 길이 제한이 없다.
- BooleanField: True 또는 False 값을 저장하는 필드.
- DateField: 날짜 값을 저장하는 필드.
- DateTimeField: 날짜와 시간 값을 저장하는 필드.
- FloatField: 부동 소수점 숫자 값을 저장하는 필드.
- DecimalField: 고정 소수점 숫자 값을 저장하는 필드.
- FileField: 파일을 저장하는 필드로, 실제 파일을 서버에 업로드하여 저장.
- 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 |