[Django] ORM을 사용한 데이터베이스 쿼리 방법

LeeYun·6일 전

ORM을 사용한 데이터베이스 쿼리 단계별 안내

  1. 모델 및 필드 정의

    • python manage.py startapp <app_name> 명령을 사용하여 새 Django 앱을 생성
    • 앱 디렉토리의 models.py 파일을 연다.
    • 필요한 모듈을 임포트한다. from django.db import models
    • 모델을 정의하기 위해 models.Model 클래스를 상속하는 클래스를 작성한다.
    • 사용 가능한 필드 유형(CharField, IntegerField 등)을 사용하여 모델에 필드를 추가한다.
    • 필드에 대한 추가적인 옵션을 설정한다. 예를 들어 CharField의 경우 max_length를 설정할 수 있다.
    • ForeignKey, OneToOneField 또는 ManyToManyField를 사용하여 모델 간의 관계를 정의합니다.
  2. 마이그레이션과 데이터베이스 스키마 관리

    • python manage.py makemigrations <app_name> 명령을 사용하여 앱에 대한 초기 마이그레이션을 생성한다.
    • python manage.py migrate 명령을 사용하여 데이터베이스 스키마를 업데이트한다.
  3. 객체 생성 및 데이터베이스에 저장

    • 앱의 views.py 파일에서 모델을 임포트한다.
    • 모델 클래스를 인스턴스화하여 모델의 인스턴스를 생성한다.
    • 인스턴스의 필드 값을 설정한다.
    • save() 메서드를 사용하여 인스턴스를 데이터베이스에 저장한다.
  4. 데이터베이스에서 객체 검색

    • 모델의 objects 매니저를 사용하여 데이터베이스를 쿼리
    • filter() 메서드를 사용하여 특정 조건과 일치하는 객체를 검색
    • get() 메서드를 사용하여 특정 조건을 기반으로 단일 객체를 검색
    • exclude() 메서드를 사용하여 특정 조건과 일치하지 않는 객체를 제외
    • order_by() 메서드를 사용하여 검색된 객체를 특정 필드를 기준으로 정렬
    • 슬라이싱 ([start:stop])을 사용하여 검색된 객체의 수를 제한
  5. 객체 업데이트

    • 데이터베이스에서 객체를 검색
    • 객체의 필드 값을 업데이트
    • 변경된 내용을 데이터베이스에 저장하기 위해 객체를 저장
  6. 객체 삭제

    • 데이터베이스에서 객체를 검색
    • 객체의 delete() 메서드를 호출하여 데이터베이스에서 삭제

다음은 Django의 ORM을 사용하는 예제 코드입니다.

# models.py
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()

    def __str__(self):
        return self.name

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

    def __str__(self):
        return self.title
# views.py
from django.shortcuts import render
from .models import Author, Book

def home(request):
    # 객체 생성 및 데이터베이스에 저장
    author = Author(name='John Doe', age=30)
    author.save()

    book = Book(title='My Book', author=author)
    book.save()

    # 데이터베이스에서 객체 검색
    books = Book.objects.all()  # 모든 책 검색
    book = Book.objects.get(title='My Book')  # 특정 책 검색

    # 객체 업데이트
    book.title = 'New Book Title'
    book.save()

    # 객체 삭제
    book.delete()

    return render(request, 'home.html')

Django ORM의 쿼리 API와 메서드

ORM은 복잡한 데이터베이스 작업을 수행하기 위한 다양한 쿼리 API와 메서드를 제공합니다. Django의 ORM은 고수준 API를 사용하여 데이터베이스와 상호작용할 수 있는 다양한 쿼리 메서드를 제공합니다. 여기에는 일반적으로 사용되는 몇 가지 쿼리 메서드가 있다

  • 필터링
    - filter(**kwargs) : 주어진 조회 매개변수와 일치하는 QuerySet을 반환

    • exclude(**kwargs) : 주어진 조회 매개변수와 일치하지 않는 QuerySet을 반환
    • get(**kwargs) : 주어진 조회 매개변수와 일치하는 단일 객체를 반환 일치하는 항목이 없을 경우 DoseNotExist 예외 발생, 여러 개의 일치하는 항목이 있을 경우 MultipleObjectsReturned 예외 발생
    • first() : QuerySet에서 첫 번째 객체를 반환
    • last() : QeurySet에서 마지막 객체를 반환
  • 쿼리 연결
    - filter().exclude() : 여러 개의 필터링 조건을 연결할 수 있다.

    • fitler().order_by() : 결과의 정렬 순서를 지정할 수 있다.
    • filter().values() : 모델 인스턴스 대신 딕셔너리를 포함하는 QuerySet를 반환한다.
  • 집계
    - aggregate(**kwargs) : QuerySet에서 집계 작업(개수 세기, 합산, 평균 등)을 수행한다.

  • 어노테이션
    - annotate(**kwargs) : 제공된 어노테이션을 기반으로 QuerySet의 각 객체에 추가 필드를 추가한다.

  • 관련 객체
    - select_related() : 조인을 사용하여 관련된 객체를 단일 데이터베이스 쿼리로 가져온다.

    • prefetch_related() : 관련된 객체를 효율적으로 가져오기 위해 별도의 쿼리에서 미리 가져온다.
  • 조인과 관계
    - Join() : 테이블 간에 명시적인 조인을 수행

    • select_related() : 조인을 사용하여 관련된 객체를 가져와 데이터베이스 쿼리 수를 줄인다.
    • prefetch_related() : 별도의 쿼리를 사용하여 관련된 객체를 효율적으로 가져온다.
    • reverse() : 역방향 관계를 따라 관련된 객체를 가져온다.
  • 정렬과 정렬 순서
    - all() : QuerySet에 있는 모든 객체를 반환한다.

    • values_list(*fields) : 모델 인스턴스 대신 튜플을 포함하는 QuerySet을 반환한다.
    • values(*fields) : 모델 인스턴스 대신 딕셔너리를 포함하는 QuerySet을 반환한다.
    • distinct(*fields) : 고유한 값을 가진 QuerySet을 반환한다.

이는 Django의 ORM에서 사용 가능한 쿼리 메서드의 몇 가지 예시에 불과하다. 쿼리 메서드와 사용법에 대한 포괄적인 목록은 Django 문서를 참조하실 수 있다.

profile
AI/Network

0개의 댓글