ORM을 사용한 데이터베이스 쿼리 단계별 안내
모델 및 필드 정의
python manage.py startapp <app_name> 명령을 사용하여 새 Django 앱을 생성models.py 파일을 연다.from django.db import modelsmodels.Model 클래스를 상속하는 클래스를 작성한다.마이그레이션과 데이터베이스 스키마 관리
python manage.py makemigrations <app_name> 명령을 사용하여 앱에 대한 초기 마이그레이션을 생성한다.python manage.py migrate 명령을 사용하여 데이터베이스 스키마를 업데이트한다.객체 생성 및 데이터베이스에 저장
데이터베이스에서 객체 검색
객체 업데이트
객체 삭제
다음은 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() : 여러 개의 필터링 조건을 연결할 수 있다.
집계
- 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 문서를 참조하실 수 있다.