Django
Chapter 2-8 Django ORM 완전 정복: 데이터 삭제, 업데이트, 필터링 실습 정리
Chansman
2025. 4. 30. 18:31
📘 Django ORM 완전 정복: 데이터 삭제, 업데이트, 필터링 실습 정리
이번 포스트에서는 Django ORM을 사용하여 데이터베이스 객체를 **생성(Create), 읽기(Read), 수정(Update), 삭제(Delete)**하는 실습 중심의 강의 내용을 바탕으로 ORM의 핵심 사용법과 주의사항을 정리합니다.
1️⃣ 객체 삭제 기능 구현 🗑️
- 개별 객체 삭제는 .delete() 메서드로 수행합니다.
b = Bookmark.objects.get(id=7)
b.delete() # 1개 삭제됨
- 삭제된 객체는 메모리에는 존재하나 ID는 삭제됨 → DB에서는 제거된 상태
- 장고는 객체의 id 존재 여부로 DB 저장 여부를 판단합니다.
print(b.id) # None 출력됨 (삭제 후)
2️⃣ 북마크 삭제 과정 및 안전성 체크 🗂️
- **삭제 전 셀렉트(조회)**로 삭제 대상이 정확한지 확인 필수
bookmarks = Bookmark.objects.filter(name__icontains="야후")
print(bookmarks)
bookmarks.delete()
- 🔥 딜리트 전 반드시 필터로 조회해보는 습관 → 실수 방지!
- .filter()는 리스트형 쿼리셋 반환 → 안전하게 여러 개 삭제 가능
3️⃣ ORM 설정과 환경 구성 🐍
- ipython, django-extensions 설치 후 shell_plus 사용
pip install ipython django-extensions
python manage.py shell_plus
- 자동으로 모델 import
- User, Bookmark 등 ORM 관련 모델이 즉시 사용 가능
4️⃣ 쿼리셋 사용법 & 유용한 메서드 🔍
메서드 기능 예시
all() | 전체 조회 | Bookmark.objects.all() |
get() | 단일 객체 조회 | Bookmark.objects.get(id=2) |
first() | 첫 객체 조회 | Bookmark.objects.first() |
last() | 마지막 객체 조회 | Bookmark.objects.last() |
filter() | 조건에 맞는 목록 조회 | filter(id__gt=2) |
exclude() | 특정 조건 제외 | exclude(name="다음") |
🔎 .get()은 결과가 없거나 여러 개면 에러 발생 → filter()가 더 안전함
5️⃣ 조건 검색 연산자와 문자열 검색 활용
연산자 의미 사용 예시
gt | 초과 | id__gt=2 |
gte | 이상 | id__gte=2 |
lt | 미만 | id__lt=10 |
lte | 이하 | id__lte=10 |
icontains | 포함 (LIKE 검색) | name__icontains="네이버" |
startswith | 시작 문자열 | name__startswith="네" |
endswith | 끝 문자열 | name__endswith="버" |
in | 목록 포함 | name__in=["네이버", "다음"] |
💡 조건은 숫자, 문자열, 날짜 모두 활용 가능
6️⃣ 객체 생성 & 저장 로직 요약
- 클래스로 객체 생성 후 .save() 호출 시 DB에 저장됨
bm = Bookmark(name="새 객체", url="https://test.com")
bm.save() # 저장됨
- id가 없는 상태에서 저장하면 새 객체로 생성됨
- id가 존재하면 기존 객체를 업데이트
7️⃣ 언더바와 퍼스트/라스트 활용법
- 마지막 실행 결과는 _ 언더바로 접근 가능
b = _ # 직전 실행 결과 (예: Bookmark.objects.first())
- first()와 last()는 QuerySet을 쉽게 탐색할 수 있음
first_bm = Bookmark.objects.first()
last_bm = Bookmark.objects.last()
8️⃣ 업데이트 & 삭제 실습 흐름 정리 🔄
✅ 업데이트 실습 예시
Bookmark.objects.filter(url__icontains="naver").update(name="네이버")
- 필터 조건에 맞는 모든 객체 이름을 변경함
✅ 삭제 실습 예시
Bookmark.objects.filter(name__icontains="야후").delete()
- 이름에 '야후'가 포함된 객체 전체 삭제
- filter() → delete() 방식 추천 (에러 방지 + 범위 명확)
✅ 실무 팁 요약
- ❌ 직접 .delete()만 사용하면 위험
- ✅ 삭제 전 .filter()로 결과 확인 필수
- ✅ .get() → 다수일 때 에러 발생 주의 → filter() 대안 활용
- ✅ 조건 검색 시 icontains, startswith 등 적극 활용
- ✅ QuerySet은 리스트가 아니라 리스트 유사 객체 → for, 인덱싱, .count() 등 가능
🎯 ORM은 단순한 DB 접근 도구가 아니라, 효율적인 데이터 흐름을 위한 핵심 로직입니다.
이 글을 통해 CRUD 연산 중 특히 삭제와 필터링을 안전하게 구현하는 법을 실무 관점에서 이해해보세요!