Django ORM

Ryu Honggyu·2024년 8월 16일

Django

목록 보기
7/19
post-thumbnail

ORM(Object-Relational Mapping)

정의

  • Object-Relational Mapping. 객체 관계형 맵핑.
  • SQL 없이 파이썬만으로 DB를 조작할 수 있게 해줌.
  • Django ORM을 비롯한 다양한 ORM 도구들이 존재함. (단 Django ORM을 자주 쓰게 될 것)

주요 사용처

  • 웹 애플리케이션 개발: 블로그, 전자상거래 사이트 등에서 DB 조작을 쉽게 처리하기 위해 사용.
  • 관리 인터페이스: Django Admin과 같은 관리 도구에서 데이터 관리를 효율적으로 수행.
  • 데이터 마이그레이션: 프로젝트 확장 시 DB 스키마 변경을 쉽게 관리.
  • 자동화된 테스트: 테스트 환경에서 DB 작업을 간편하게 설정 및 초기화.
  • API 개발: RESTful API 개발 시 DB와의 상호작용을 간소화.

Django Shell

Django Shell 설치

  • Django Shell 설치 = ORM 사용을 위한 세팅 과정
  • Django Shell: Django 프로젝트에서 파이썬 코드를 실행할 수 있는 인터랙티브 쉘 환경을 제공함. 여기서 ORM 명령어를 사용해 DB와 상호작용할 수 있음.
$ python manage.py shell

Django Shell 확장

  • Django Shell을 더 확장된 기능으로 사용하기 위해서는 django-extensionsipython 패키지를 설치하고 설정해야 함.
  1. django-extensions 설치

    $ pip install django-extensions
    
  2. settings.py 수정

# settings.py
INSTALLED_APPS = [
    ...
    'django_extensions',
    ...
]
  1. ipython 설치

    $ pip install ipython
    
  2. 현재 설치된 패키지들을 requirements.txt 파일로 저장하기

    $ pip freeze > requirements.txt
    
  • 이후 Django Shell을 사용하려면 다음 명령어를 입력함:
$ python manage.py shell_plus
  • shell_plusdjango-extensions를 통해 제공되는 명령어로, 기본 shell 명령어보다 더 많은 기능과 자동 임포트를 지원함.
  • ORM 사용을 위한 세팅 완료

ORM 명령어

조회하기

  • Model.objects.all(): 특정 모델의 모든 데이터를 조회할 때 사용함. DB에 저장된 모든 객체를 QuerySet 형태로 반환하며, 반환된 QuerySet은 반복 가능하며 각 객체를 개별적으로 접근할 수 있음.
$ Article.objects.all()
  • Model.objects.get(조회할 대상): 특정 모델의 조건에 맞는 특정 객체를 하나만 조회할 때 사용함. 아래 예제는 id가 1인 Article 객체를 반환함.
$ Article.objects.get(id=1)

필터

  • Model.objects.filter(조건): 조건에 맞는 객체들을 모두 조회할 때 사용함. 조건에 맞는 객체가 없을 경우 빈 QuerySet을 반환함.
    아래 예제는 title 필드에 'a'가 포함된 모든 Article 객체를 조회함.
$ Article.objects.filter(title__contains='a')
  • Lookup 표현식
표현식설명예시
field__exact='value'필드가 정확히 'value'와 일치하는 객체 조회title__exact='Title'
field__iexact='value'필드가 'value'와 대소문자 구분 없이 일치하는 객체 조회title__iexact='title'
field__contains='value'필드에 'value'가 포함된 객체 조회title__contains='a'
field__icontains='value'필드에 'value'가 대소문자 구분 없이 포함된 객체 조회title__icontains='a'
field__gt=value필드가 'value'보다 큰 객체 조회id__gt=10
field__lt=value필드가 'value'보다 작은 객체 조회id__lt=10
field__gte=value필드가 'value'보다 크거나 같은 객체 조회id__gte=10
field__lte=value필드가 'value'보다 작거나 같은 객체 조회id__lte=10
field__startswith='value'필드가 'value'로 시작하는 객체 조회title__startswith='T'
field__endswith='value'필드가 'value'로 끝나는 객체 조회title__endswith='e'
field__year=valueDateTimeField의 연도가 'value'인 객체 조회created_at__year=2024
field__month=valueDateTimeField의 월이 'value'인 객체 조회created_at__month=1
field__day=valueDateTimeField의 일이 'value'인 객체 조회created_at__day=15
field__in=[value1, value2]필드가 지정된 값 목록에 있는 객체 조회id__in=[1, 2, 3]
field__isnull=True필드가 NULL인 객체 조회updated_at__isnull=True
field__regex=r'regex'필드가 정규 표현식 'regex'와 일치하는 객체 조회title__regex=r'^[A-Za-z]'

생성하기

  • 제목이 "Title", 내용이 "Content"인 Article 객체를 생성하는 세가지 방법.
  1. 객체 생성 후 저장하기
article = Article(title='Title', content='Content')
article.save()
  • 객체를 생성한 후 save() 메서드를 호출하여 DB에 저장하는 방식.
  • 객체 생성 후 데이터를 추가로 수정할 수 있어 유연한 데이터 조작이 가능함.
  1. 객체 속성 개별 지정 후 저장하기
article = Article()
article.title = 'Title'
article.content = 'Content'
# save()하기 전까지는 DB에 저장되지 않음
article.save()
  • 빈 객체를 생성한 후, 각 속성을 개별적으로 지정하고 save() 메서드를 호출하여 DB에 저장하는 방식.
  • 객체 생성 시 데이터를 미리 지정하지 않고, 필요한 속성을 순차적으로 설정 가능.
  • 데이터가 단계적으로 제공될 때 적합함.
  1. 객체 생성과 동시에 저장하기
Article.objects.create(title='Title', content='Content')
  • create() 메서드를 사용하여 객체를 생성하면서 동시에 DB 에 저장하는 방식.
  • 코드가 간결하며, 생성과 저장을 한 번에 처리 가능.
  • 단순한 객체 생성 및 저장 작업에 적합함.

__str__ 메서드

class Article(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    def __str__(self):
        return self.title
  • __str__: 객체를 문자열로 표현할 때 호출되며, Django Admin이나 Django 쉘에서 객체를 조회할 때 유용함.
  • 객체의 메모리 주소 대신, 정의된 문자열 (예제에선 title) 이 출력되므로, DB 의 여러 객체들 사이에서 원하는 객체를 쉽게 식별할 수 있음.

수정하기

  • 수정할 객체를 먼저 조회한 후, 필요한 속성을 수정하고 .save()를 호출해 DB에 반영함.
$ article = Article.objects.get(id=1)
$ article.title = 'Updated Title'
$ article.save()
  • 위 예제는 id가 1인 Article 객체의 제목을 'Updated Title'로 수정한 후 DB에 반영함.

삭제하기

  • 특정 객체를 조회한 후 .delete() 명령어를 사용해 DB에서 삭제함.
$ article = Article.objects.get(id=2)
$ article.delete()
  • 위 예제는 id가 2인 Article 객체를 DB에서 삭제함.
profile
알고리즘 & 웹 & CS & AI

0개의 댓글