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 연산 중 특히 삭제와 필터링을 안전하게 구현하는 법을 실무 관점에서 이해해보세요!