본문 바로가기
Programming/Django

[Python Django] 🐍 Django에서 ManyToManyField .add() 시 발생하는 ValueError 해결하기

by Mandy's 2025. 7. 23.

Django ORM을 사용하다 보면, ManyToManyField 관계에서 .add()를 사용하려다가 아래와 같은 오류를 만날 수 있습니다.

ValueError: Cannot add "<Country: Country object (None)>": instance is on database "default", value is on database "None"

이 에러는 초보자뿐만 아니라 숙련자에게도 자주 혼동을 주는 문제입니다.
이 글에서는 이 오류가 왜 발생하는지, 그리고 어떻게 해결할 수 있는지를 명확하게 정리해보겠습니다.


💥 문제 상황

from book_outlet.models import Book, Country

mys = Book.objects.all()[1]  # "My Story" 책

germany = Country(name="Germany", code="DE")  # Country 객체 생성 (하지만 아직 저장 X)

mys.published_countries.add(germany)  # ❌ 여기서 에러 발생!

에러 메시지:

ValueError: Cannot add "<Country: Country object (None)>": instance is on database "default", value is on database "None"

🔎 원인 분석

이 에러는 germany 객체가 아직 데이터베이스에 저장되지 않았기 때문에 발생합니다.

  • Book 인스턴스는 DB에 저장된 상태
  • Country 인스턴스는 메모리 상에만 존재 (pk=None)
  • Django는 ManyToManyField에 객체를 추가할 때, 양쪽 모두가 DB에 저장된 상태여야 합니다.

✅ 해결 방법

germany.save()  # DB에 저장

mys.published_countries.add(germany)  # 이제 정상 작동

그 후 published_countries를 확인하면:

mys.published_countries.all()
# <QuerySet [<Country: Germany>]>

🧪 전체 예제 흐름 정리

from book_outlet.models import Book, Country

# 책과 국가 객체 생성
mys = Book.objects.get(title="My Story")
germany = Country(name="Germany", code="DE")

# Country 객체 저장
germany.save()

# ManyToMany 관계 연결
mys.published_countries.add(germany)

# 결과 확인
print(mys.published_countries.all())
# → <QuerySet [<Country: Germany>]>

🧠 핵심 요약

상황 설명

.add() 대상이 아직 .save()되지 않았을 때 ❌ ValueError 발생
양쪽 인스턴스가 모두 DB에 있어야 연결 가능 ✅ .save() 필수

💬 마무리

Django의 ManyToManyField는 직관적이지만, 연결 전에 양쪽 객체가 DB에 저장돼 있어야 한다는 점을 반드시 기억해야 합니다.

이 실수는 개발 중 자주 마주칠 수 있는 대표적인 M2M 오류 중 하나이며, 한 번 익혀두면 두고두고 유용합니다 😊


필요하시면 썸네일 문구, 태그 추천(#Django, #ManyToManyField, #ORM, #add오류, #ValueError)도 도와드릴게요!