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)도 도와드릴게요!
'Programming > Django' 카테고리의 다른 글
| 📌 [Django Admin 오류] list_filter에 날짜 필드를 넣었더니 오류가? (admin.E116 해결법) (0) | 2025.07.23 |
|---|---|
| [Python Django] 🔄 Django Circular & Lazy Relationships 완전 정리 (3) | 2025.07.23 |
| [Python Django] ❓Django에서 Author 모델에 slug를 꼭 만들어야 할까? (6) | 2025.07.23 |
| [Python Django] 💥 Django Admin prepopulated_fields 오류 해결기: slug 컬럼 없음 에러 (3) | 2025.07.23 |
| [Python Django] The Practical Guide - Admin, Relationship (3) | 2025.07.23 |