[Django] ORM으로 데이터 생성, 조회, 수정, 삭제(CRUD) 해보기

2026. 6. 2. 22:45·Django
반응형

 

ORM(Object-Relational Mapping)

  • 데이터베이스의 테이블을 Python 객체처럼 다룰 수 있도록 도와주는 기술
  • 편리한 데이터베이스 스키마(테이블, 컬럼 등) 생성/수정/삭제 지원
  • Python을 통해 데이터를 쉽게 조회/변경할 수 있도록 지원

 

ORM의 장점

  • SQL 직접 작성 X
  • 데이터베이스 종류에 크게 의존 X
  • Python 코드로 데이터를 쉽게 조회, 생성, 수정, 삭제 가능
  • 데이터베이스 스키마 관리 편리

 


 

Django Shell 실행

  • `python manage.py shell`
  • shell: Django 프로젝트 환경이 적용된 Python  콘솔

 

기존 모델 참고

class Post(models.Model):
    title = models.CharField(max_length=128)
    body = models.CharField(max_length=1024)
    author_name = models.CharField(max_length=32)
    points = models.PositiveIntegerField(default=0)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.id}, {self.title}"

 


 

ORM QuerySet

  • Django ORM에서 데이터를 조회하면 대부분 QuerySet 반환
    • ` >>> Post.objects.all()`
    • `<QuerySet [...]>`
  • iterable하므로 반복 가능한 형태
  • Lazy Loading(지연 로딩) 사용
    • 값이나 객체의 계산을 우리가 실제로 필요할 때까지 연기하는 프로그래밍 기법
    • 생성되는 즉시 SQL를 실행하지 않고 실제로 데이터가 필요할 때 쿼리 실행

 

QueryDict

  • 요청 데이터를 담는 객체
  QuerySet QueryDict
역할 DB 조회 결과 HTTP 요청 데이터
사용 위치 ORM(Model) View(Request)
생성 주체 Django ORM Django Request
예시 Post.objects.filter() request.GET, request.POST
담고 있는 것 Model 객체들 사용자가 보낸 데이터

 


 

데이터 생성(Create)/조회(Read)

$ python manage.py shell
13 objects imported automatically (use -v 2 for details).

Python 3.13.12 (tags/v3.13.12:1cbe481, Feb  3 2026, 18:22:25) [MSC v.1944 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)

# Model 가져오기
>>> from post.models import Post

# 전체 게시글 조회
>>> Post.objects.all()
<QuerySet []>

# 새로운 게시글 생성
>>> new_post = Post(title="제목", body="본문", author_name="작성자")

# 결과: 데이터 없음
>>> new_post
<Post: Post object (None)>
>>> Post.objects.all()
<QuerySet []>

# 객체 생성했다고 데이터베이스에 저장되지 않음
# save()로 데이터 저장 필요
>>> new_post.save()
>>> Post.objects.all()
<QuerySet [<Post: Post object (1)>]>

# Primary Key 자동 생성 (id와 pk는 동일)
>>> new_post.id
1
>>> new_post.pk
1

# 저장 전에는 id(pk) 존재하지 않음
# save()가 실행되는 순간 데이터베이스에서 발급
>>> new_post_2 = Post(title="제목2", body="본문2", author_name="작성자2")
>>> new_post_2.id
>>> new_post_2.id is None
True

 

ORM 데이터 수정(Update)

$ python manage.py shell
13 objects imported automatically (use -v 2 for details).

Python 3.13.12 (tags/v3.13.12:1cbe481, Feb  3 2026, 18:22:25) [MSC v.1944 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)

>>> from post.models import Post
>>> Post.objects.all()
<QuerySet [<Post: 1, 제목>]>
>>> Post.objects.all()[0]
<Post: 1, 제목>

# 조건에 맞는 데이터 조회
>>> Post.objects.get(id=1)
<Post: 1, 제목>
>>> post = Post.objects.get(id=1)
>>> post
<Post: 1, 제목>

# 데이터 수정
>>> post.title
'제목'
>>> post.title="새로운 제목"
>>> post.title
'새로운 제목'
>>> post.save()
>>> post = Post.objects.get(id=1)
>>> post.title
'새로운 제목'
>>> post
<Post: 1, 새로운 제목>

# 자동 생성된 값 확인
>>> post.points
0
>>> post.created_at
datetime.datetime(2026, 5, 30, 19, 25, 35, 223307, tzinfo=datetime.timezone.utc)

 

ORM 데이터 조회(filter)

  • 조건에 맞는 데이터를 조회할 때 사용
  • Post.objects.filter(title="새로운 제목")
  • `startswith`: 특정 문자열로 시작하는 조회
    • Post.objects.filter(title__startswith="새")
  • `lt`: Less Than, 미만
    • Post.objects.filter(points__lt=10)
  • `gte`: Greater Than or Equal, 이상
    • Post.objects.filter(points__gte=10)
    •  

 

get()과 filter()의 차이

  • `get()`: 조건에 맞는 데이터를 하나만 조회
    • `post = Post.objects.get(id=1)`
    • 객체(Object) 반환
    • 조건에 맞는 데이터가 반드시 1개여야 함(2개 이상이면 예외 발생)
    • 데이터가 없으면 예외 발생(DoesNotExist)
    • 즉시 쿼리 실행
  • `filter()`: 조건에 맞는 데이터를 조회
    • QuerySet 반환
    • 데이터가 여러 개여도 가능
    • 데이터가 없어도 예외 발생 X
    • Lazy Loading

 

ORM 데이터 삭제(Delete)

  • `post.delete()`
  • 조건에 맞는 데이터 여러 개 삭제: `Post.objects.filter(title="제목").delete()`

 


 

ORM과 SQL 비교

ORM SQL
Post.objects.all() SELECT * FROM post
Post.objects.get(id=1) SELECT * FROM post WHERE id=1
Post.objects.filter(title="제목") SELECT * FROM post WHERE title='제목'
post.save() INSERT 또는 UPDATE
post.delete() DELETE FROM post

 

 

 

[참고] 실전! Django 입문 강의

반응형
'Django' 카테고리의 다른 글
  • [Django] Function-Based View와 Class-Based View
  • [Django] 좋아요 기능 구현과 F Expression
  • [Django] 장고 Model과 Migration 이해하기
  • [Django] 장고 App 생성과 등록
올콩
올콩
콩 심은 데 콩 난다
  • 올콩
    콩스토리
    올콩
  • 전체
    오늘
    어제
    • 분류 전체보기 (226) N
      • SSAFY (10)
      • Algorithm (123)
        • 이론 (6)
        • 백준 (BOJ) (114)
        • 프로그래머스 (2)
        • 코드트리 (1)
      • Trouble Shooting (11)
      • Frontend (7)
      • React (17)
      • Next.js (5)
      • Vue (4)
      • Django (12) N
      • Node.js (2)
      • HTML (9)
      • DevOps (4)
        • Git (4)
      • Language (13)
        • JavaScript (0)
        • Java (13)
      • Embedded (1)
      • CS (5)
        • Network (1)
        • Blockchain (4)
      • 자격증 (2)
      • 기타 (1)
        • Tistory (1)
  • 블로그 메뉴

    • GitHub
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    DP
    브루트포스
    강의
    싸피
    중복순열
    알고리즘
    SSAFY
    SSAFYcial
    오블완
    티스토리챌린지
    파이썬
    백준
    백트래킹
    그리디
    블록체인
    React
    힙
    수학
    dfs
    구현
    django
    Next.js
    Java
    순열
    html5
    Algorithm
    bfs
    Heap
    Error
    우선순위큐
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
올콩
[Django] ORM으로 데이터 생성, 조회, 수정, 삭제(CRUD) 해보기
상단으로

티스토리툴바