logo

JEONGGON

    블로그
github
mode
목 차
down-arrow

Django ORM

2023.03.22.

post-thumbnail

ORM

1. ORM이란?

  • ORM이란, Object-Relational-Mapping(객체 지향 연결)의 줄임말로 객체지향 프로그래밍 언어(ex. 파이썬, 자바스크립트 등)을 사용하여 이를 지원하지 않는 시스템과의 호환을 가능하게 하도록 데이터를 변환해주는 프로그래밍 기술을 말한다.
  • Django에서는 Python을 통하여, SQL언어를 사용하는 DB를 조작할 수 있도록 한다.


1-1. QuerySet API

ORM, QuerySet API
ORM과 QuerySet API 개념도


  • QuerySet API는 ORM에서 데이터를 조작하는데 사용하는 다양한 도구모음이다.
  • API를 사용하여 SQL이 아닌 Python 코드로 데이터 처리
# QuerySet API 구문

[Model


class name].objects.[QuerySet API]

# ex) Article.objects.all()

참고 : Django - QuerySet API


1-2. Query

  • 쿼리란 DB에 보내는 일종의 요청으로 SQL에서의 SELECT문을 예로 들 수 있다.
  • Django에서는 파이썬으로 작성된 코드가 ORM을 통해 SQL로 변환된 후, DB에 전달
  • 데이터 베이스의 응답 데이터를 ORM에서 QuerySet의 자료 형태로 반환된다.

1-3. QuerySet

  • QuerySet은 DB에서 응답받은 객체모음, 데이터모음이다.
  • 이는 리스트의 형태로 순회가능한 데이터이다.
  • 다만, 단일한 객체를 반환 받을 경우, QuerySet이 아닌 모델 클래스의 인스턴스로 반환


2. ORM 생성

2-1. QuerySet API 초기 설정

  • ORM을 활용하기 위해서는 초기 세팅이 필요
  1. 패키지 설치
$ pip install ipython
$ pip install django-extensions
  1. Django 확장프로그램 앱에 등록
# settings.py

INSTALLED_APPS = [
    'django_extensions',
    ...
]
  1. 패키지 최신화
$ pip freeze > requirements.txt

2-2. Django shell

  • Django 환경 안에서 실행되는 Python shell
  • 입력하는 QuerySet API 구문이 django 프로젝트에 영향을 미침

  1. Django에서 파이썬 shell 실행
$ python manage.py shell_plus
  1. 데이터 객체 생성하기
# ex) 방법1

$ article = Article() # 클래스(Article)에서 인스턴스(article) 할당
$ article.title = 'first' # 인스턴스 변수(title)에 값 할당
$ article.content = 'Django!' # 인스턴스 변수(content)에 값 할당
$ article.save() # 할당한 값 DB에 저장



# ex) 방법2

$ article = Article(title='first', content='Django!') # 변수를 할당한 클래스를 통해 인스턴스 생성
$ article.save() # 저장 메서드



# ex) 방법3

$ Article.objects.create(title='first', content='Django!') # QuerySet API의 create() 메서드를 통해 DB에 생성 및 저장


3. ORM 조회

3-1. 전체 데이터 조회

  • .all() 메서드 사용
$ Article.objects.all()

3-2. 단일 데이터 조회

  • .get() 메서드 사용
  • get 메서드의 경우, 객체를 찾을 수 없으면, DoesNotExist 예외발생
  • 둘 이상의 객체를 찾으면 MultipleObjectsReturned 예외발생
  • 따라서 primary key와 같은 메서드 안에 고유성(uniqueness)을 보장하는 특징을 삽입해야 함
$ Article.objects.get(pk=1)

3-3. 특정 조건 데이터 조회

  • .filter() 메서드 사용
  • 메서드 안에 특정 조건을 삽입
$ Article.objects.filter(content='Django!')


4. ORM 수정

  • 데이터 수정
# 수정할 인스턴스 조회
$ article = Article.objects.get(pk=1)

# 인스턴스 변수를 변경
$ article.title = 'hello'

# 저장
$ article.save()

# 수정되었는지 확인
$ article.title

# 출력
# 'hello'


5. ORM 삭제

  • 데이터 삭제
# 삭제할 인스턴스 조회
$ article = Article.objects.get(pk=1)

# delete() 메서드 호출 (삭제 된 객체가 반환됨)
$ article.delete()
# (1, { 'articles.Article' : 1})


6. 참고

6-1. Field lookups

  • 특정 레코드에 대한 조건을 설정하는 방법
  • QuerySet 메서드 filter(), exclude(), get()에서 키워드 인자로 지정됨
# content 컬럼에 'dj'가 포함된(contains) 모든 데이터 조회
$ Article.object.filter(content__contains='dj')

참고 : Django - Field lookups


6-2. ORM, QuerySet API를 왜 사용할까?

  • 데이터 베이스 쿼리를 추상화하여 Django 개발자가 데이터 베이스를 직접 상호작용하지 않아도 됨
  • 데이터 베이스와의 결합도(Coupling)을 낮추고 개발자가 직관적, 생산적으로 개발할 수 있도록 해줌
djangoframeworkORM
profile

조정곤

주니어 프론트엔드 개발자

github
linkedin
instagram
email

< 이전글

Django View의 ORM

다음글 >

Django Model

Django 포스트 (19)

down-arrow