Folevel
[TIL - 24. 08. 29] Django ORM 사용법 정리 본문
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()'
# 객체를 조회하고, 없으면 새로 생성합니다.
'I Learned > Today I Learned' 카테고리의 다른 글
[TIL - 24. 09. 02.] 오답노트, FBV (Function-Based View)와 CBV (Class-Based View) (0) | 2024.09.02 |
---|---|
[TIL - 24. 08. 30] Django Rest Framework(DRF)란? (0) | 2024.08.30 |
[TIL - 24. 08. 28.] Django 팀 과제 마무리 및 발표 (0) | 2024.08.28 |
[TIL - 24. 08. 27] Djago 팀과제 (0) | 2024.08.27 |
[TIL - 24. 08. 26] Django 팀과제 (0) | 2024.08.26 |