인프런 커뮤니티 질문&답변

Semi Kim님의 프로필 이미지
Semi Kim

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

관계를 표현하는 모델 필드 (ForeignKey)

python manage.py makemigrations instagram 시 created_at default 오류가 발생합니다.

해결된 질문

작성

·

415

0

스크린샷 2023-12-14 오후 7.23.23.png스크린샷 2023-12-14 오후 7.23.11.png

comment 클래스를 정의하고나서

python manage.py makemigrations instagram 명령어를 실행하고 나니 default 값을 지정해주라는 메시지가 나왔습니다.

구글링을 통해 default 값을 지정해 주었더니 옵션값은 하나만 지정해 주어야 한다는 error 메시지가 출력 되었습니다.

(참고한 블로그글 은 https://terrorjang.tistory.com/entry/Django-It-is-impossible-to-add-the-field-createdat-with-autonowaddTrue#google_vignette

이곳 입니다.)

 

어떻게 해결해야 할지 몰라서 도움을 요청합니다.

답변 4

1

Semi Kim님의 프로필 이미지
Semi Kim
질문자

migration 삭제 하고 강의 보면서 다시 적용하니깐 해결 되었습니다.

감사합니다

1

이진석님의 프로필 이미지
이진석
지식공유자

모델의 author 외래키에는 null=False (디폴트) 인데, 마이그레이션 파일은 수정하셔서 null=True로 설정하셨다면, 모델과 데이터베이스 스키마가 서로 일치하지 않는 상황입니다. 그러니, 이후에 다시 makemigrations 시에 모델에서는 null=False 인데 데이터베이스에서는 nullable 한 상황이니 null=False로 만들려는 마이그레이션 파일을 다시 만들려고 시도합니다. // 상황을 더 복잡하게 만드신 것이구요.

nullable 필드로 하실려면 author 모델 필드에 null=True 을 지정하고 이를 통해 마이그레이션 파일을 만들시는 것이 맞습니다.

1

이진석님의 프로필 이미지
이진석
지식공유자

makemigrations 명령에서 아래와 같은 추가 입력이 요구될 때, 입력할 값은 모델 필드 타입에 맞춰 지정하셔야 합니다. 아래 노란색 바탕의 글씨 부분이 author to post 라고 되어있는 데요. post 가 모델명이며 author 필드가 대상 모델 필드명입니다. 이 필드 타입이 models.IntegerField 라면 값을 입력하실 때 정수값으로 입력해주셔야 하며, models.CharField 라면 문자열로 입력해주셔야 합니다. 그렇게 타입이 맞아야만 migrate 명령 시에 데이터베이스에서 타입이 다름으로 인한 오류가 발생하지 않습니다.

makemigrations 명령에서는 입력한 값이 모델 필드와 타입이 맞는 지를 검사하지 않습니다. 입력된 값으로 마이그레이션 파일을 만들 뿐입니다.

image

author 필드는 models.ForeignKey 타입인데요. 외래키 필드는 값으로서 의존하는 모델의 기본키 값을 가집니다. author 필드가 의존하는 User 모델의 기본키는 장고 모델의 디폴트 모델 키로서 models.BigAutoField. 즉 자동 증가되는 정수 필드입니다. 정수 필드니까 정수값을 지정해주셔야 합니다. 예를 들어, 1 과 같은 값들 말이죠. 그럼 User 모델에 pk=1 에 해당하는 레코드가 있어야 migrate 명령이 정상적으로 수행됩니다.

--

현재의 python manage.py showmigrations instagram 명령 결과가 어떻게 나오나요? 미적용 마이그레이션 파일은 삭제하시고 다시 생성하셔도 됩니다. 적용 마이그레이션은 절대 삭제하시면 안 되구요.

살펴보시고 댓글 남겨주세요. ;-)

1

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

오류 내역을 보여주시지 않아서 정확한 파악이 어려운데요.

instagram/migrations/ 디렉토리 내에 생성된 모든 파일 내역을 공유해주시겠어요?

makemigrations 명령 시에 선택지에서 입력하신 값이 datetime 이 아닌 다른 값으로 입력하신 듯 보입니다. 모델 필드 타입에 맞춰 값을 지정해주셔야하거든요.

하나의 예시로 DateTimeField에 대해서는 아래와 같이 timezone.now 함수를 지정해보실 수 있습니다.

--

It is impossible to add the field 'created_at' with 'auto_now_add=True' to comment without providing a default. This is because the database needs something to populate existing rows.

1) Provide a one-off default now which will be set on all existing rows
2) Quit and manually define a default value in models.py.

Select an option: 1
Please enter the default value as valid Python.
Accept the default 'timezone.now' by pressing 'Enter' or provide another value.
The datetime and django.utils.timezone modules are available, so it is possible to provide e.g. timezone.now as a value.
Type 'exit' to exit this prompt

[default: timezone.now] >>> timezone.now

살펴보시고 댓글 남겨주세요.

화이팅입니다. :-)

Semi Kim님의 프로필 이미지
Semi Kim
질문자

스크린샷 2023-12-14 오후 9.33.15.png스크린샷 2023-12-14 오후 9.33.18.png스크린샷 2023-12-14 오후 9.33.44.png

이번에는 서버 재실행하고 makemigrations 을 해주었더니

It is impossible to add a non-nullable field 'author' to post without specifying a default. This is because the database needs something to populate existing rows.

Please select a fix:

1) Provide a one-off default now (will be set on all existing rows with a null value for this column)

2) Quit and manually define a default value in models.py.

Select an option: 1

Please enter the default value as valid Python.

The datetime and django.utils.timezone modules are available, so it is possible to provide e.g. timezone.now as a value.

Type 'exit' to exit this prompt

>>> timezone.now

이렇게 잘못 입력을 하고 나서

python manage.py migrate instagram를 실행했더니

스크린샷 2023-12-14 오후 9.43.44.png스크린샷 2023-12-14 오후 9.44.07.pngtype error가 나오는거 같습니다.

서버에서는

python manage.py migrate instagram

하라고 경고메시지를 출력 해주는데, migrate 가 안되서 어디를 수정해주어야 할지 모르겠습니다.

Semi Kim님의 프로필 이미지
Semi Kim
질문자

imageimageimage위에 1,2,3 이 다 올라가지 않았네요

Semi Kim님의 프로필 이미지
Semi Kim

작성한 질문수

질문하기