Notice
Recent Posts
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
관리 메뉴

Folevel

[TIL - 24. 08. 29] Django ORM 사용법 정리 본문

I Learned/Today I Learned

[TIL - 24. 08. 29] Django ORM 사용법 정리

NADARA 2024. 8. 29. 20:57

 

 

Django ORM(Object-Relational Mapping)은 Django 프레임워크에서 데이터베이스와 상호작용하기 위한 도구이다. ORM을 사용하면 SQL 쿼리를 직접 작성하지 않고 Python 코드로 데이터베이스 작업을 수행할 수 있다.

 

 

모델을 정의하고 마이그레이션 진행

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    birth_date = models.DateField()

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

-----------------------------------------------------------------
# 마이그레이션 파일 생성
python manage.py makemigrations

# 데이터베이스에 적용
python manage.py migrate

 

 

1. 데이터 생성

# 단일 레코드 생성
author = Author.objects.create(name="George Orwell", birth_date="1903-06-25")

# 인스턴스 생성 후 저장
book = Book(title="1984", publication_date="1949-06-08", author=author)
book.save()

 

 

2.데이터 조회

# 전체 레코드 조회
authors = Author.objects.all()

# 특정 조건으로 필터링
george = Author.objects.get(name="George Orwell")
books = Book.objects.filter(author=george)

# 조건에 맞는 첫 번째 레코드 조회
first_book = Book.objects.filter(author=george).first()

# 특정 필드만 선택
book_titles = Book.objects.values_list('title', flat=True)

 

 

3.데이터 수정

# 인스턴스를 가져와서 수정 후 저장
author = Author.objects.get(name="George Orwell")
author.birth_date = "1903-06-25"
author.save()

# 조건에 맞는 레코드를 일괄 업데이트
Book.objects.filter(author=author).update(publication_date="1950-01-01")

 

4. 데이터 삭제

# 특정 레코드 삭제
author = Author.objects.get(name="George Orwell")
author.delete()

# 조건에 맞는 모든 레코드 삭제
Book.objects.filter(author=author).delete()

 

5. 정렬

# 제목을 기준으로 오름차순 정렬
books = Book.objects.all().order_by('title')

# 제목을 기준으로 내림차순 정렬
books = Book.objects.all().order_by('-title')

 

6. 연산 및 집계

from django.db.models import Count, Avg

# 저자가 작성한 책의 수를 셀 때
author_books_count = Author.objects.annotate(num_books=Count('book'))

# 평균 출판 연도를 계산할 때
average_publication_year = Book.objects.aggregate(Avg('publication_date'))

 

7. 관계형 쿼리 (ForeignKey, ManyToManyField)

# ForeignKey 관계를 이용한 쿼리
books_by_orwell = Book.objects.filter(author__name="George Orwell")

# ManyToMany 관계 쿼리 (예시로 Book과 Genre의 관계 가정)
class Genre(models.Model):
    name = models.CharField(max_length=50)

class Book(models.Model):
    title = models.CharField(max_length=200)
    genres = models.ManyToManyField(Genre)

# 특정 장르에 속한 책들 조회
science_fiction_books = Book.objects.filter(genres__name="Science Fiction")

 

8. 쿼리 최적화

books = Book.objects.select_related('author').all()
# 'select_related'
# ForeignKey 관계에서 관련된 객체를 미리 가져올 때 사용하여 쿼리의 수를 줄입니다.


books = Book.objects.prefetch_related('genres').all()
# 'prefetch_related'
# ManyToMany 관계에서 여러 테이블을 미리 로드할 때 사용합니다.

 

9; 사용자 정의 쿼리셋

from django.db import models

class BookQuerySet(models.QuerySet):
    def published_after(self, year):
        return self.filter(publication_date__year__gt=year)

class Book(models.Model):
    title = models.CharField(max_length=200)
    publication_date = models.DateField()

    objects = BookQuerySet.as_manager()

# 사용 예시
recent_books = Book.objects.published_after(2000)

 

10. 기타 기능

exists = Author.objects.filter(name="George Orwell").exists()
# 'exists()'
# 쿼리셋에 결과가 있는지 확인합니다.


author, created = Author.objects.get_or_create(name="George Orwell", defaults={'birth_date': "1903-06-25"})
# 'get_or_create()'
# 객체를 조회하고, 없으면 새로 생성합니다.