🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

  • 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

needs to have a value for field "id" before this many-to-many relationship can be used.

22.02.25 14:19 작성 조회수 416

0

 

 

 

 

어제 강의 듣고 포스팅 써봤을때는 잘 올라갔는데

갑자기 오늘 이어서 포스팅 쓰고 다음 강의 들으려니까 이런 오류가 뜨네요..

강의에서 manytomanay field가 쓰인 부분은

tag_set = models.ManyToManyField('Tag', blank=True)
 
이거뿐이었는데, 여기서 id관련 언급은 없었는데
왜 갑자기 이런 오류가 뜨는것일까요?

답변 1

답변을 작성해보세요.

0

안녕하세요.

장고 모델에서 id 필드는 데이터베이스의 기본키(primary key) 필드로서, 모델에 기본키를 설정하지 않으면 디폴트로 지정이 되는 필드입니다. 기본키는 원하는 필드에 primary_key=True 옵션을 지정할 수 있습니다.

models.ManyToMayField 는 데이터베이스에서 두 테이블 상의 데이터들(Rows) 간의 관계를 지정할 수 있는 필드인데요.  관계를 지정할려면 필히 두 데이터가 데이터베이스에 저장이 되어있어야 합니다. 데이터베이스에 저장이 되지 않은 필드는 관계를 지정할 수가 없습니다. 데이터베이스 상에 데이터가 없으니깐요.

장고 모델을 통해 데이터베이스에 데이터를 저장하면, 기본키에 값이 지정이 됩니다. 모델에 기본 지정되는 기본키는 models.AutoField (장고 3.2부터는 models.BigAutoField) 타입이며, 매 데이터 저장마다 숫자 1부터 1씩 자동증가합니다. 이는 데이터베이스에서 매 새로운 데이터(Row) 저장 시마다 값을 할당해줍니다.

보여주신 아래의 에러는 <Post: #장고> 모델 인스턴스와 Tag 모델 인스턴스 간에 관계를 지정할려고 하는 데, <Post: #장고> 모델 인스턴스가 데이터베이스에 저장이 되어있지 않아서, 기본키인 id 필드에 값이 없다고 설명을 해주고 있습니다.

"<Post: #장고>" needs to have a value for field "id" before this many-to-many relationship can be used

아래와 같은 코드에서는 말씀하신 오류가 발생하구요.

post1 = Post(title="샘플 제목")
tag = Tag.objects.first()
post1.tag_set.add(tag)   # post1 은 아직 데이터베이스에 저장되지 않았기에, M2M 관계를 맺을 수 없습니다.

하지만, 아래와 같이 데이터베이스에 저장된 Post 인스턴스는 M2M 관계 지정이 가능합니다.

post2 = Post(title="샘플 제목")  # 모델 필드 구성에 따라 지정해야할 필드가 다릅니다.
post2.save()  # 모델인스턴스.save() 외에도 데이터베이스에 저장하는 다양한 방법이 있습니다.
tag = Tag.objects.first()  # 원하는 태그 인스턴스를 찾습니다.
post2.tag_set.add(tag)  # 이제 M2M 관계 지정이 잘 동작합니다.

차근차근 정리해보세요. 화이팅입니다. :-)

 

채널톡 아이콘