[Django] ORM and Querysets

Yerin·2020년 1월 10일
0

study-django

목록 보기
3/5

image.png
(출처 The Django Book)

장고에서는 여러 종류의 데이터를 데이터베이스 종류와는 독립적인 형태로 객체화 한다. (ORM)

Django ORM?


  • Object Relational Mapping 객체 관계 매핑
  • 객체와 관계형 데이터베이스의 데이터를 자동 연결해주는 것.
  • 객체지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다.
  • 객체 모델과 관계형 모델 간에 불일치가 존재할 수 있는데 ORM을 통해 객체 간 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결할 수 있다.

장점

  • SQL query가 아닌 직관적인 코드로 (메소드) 데이터를 조작할 수 있어 개발자가 객체모델로 프로그래밍하는데 집중할 수 있다.
  • 각 객체에 대한 코드를 별도로 작성하기 때문에 코드 가독성이 좋다.
  • SQL의 절차적이고 순차적인 접근이 아닌 객체지향적인 접근으로 생산성이 좋다.
  • 재사용 및 유지보수가 용이하고 매핑정보가 명확하며 ERD 의존성이 낮다.
  • DBMS(DataBase Management System) 종속성이 낮다.

단점

  • 완벽한 ORM만으로는 서비스 구현이 어렵다. 사용하기는 편하나 설계는 신중히 해야한다.
  • 프로젝트 복잡성이 커질 경우 난이도가 높아진다.
  • 잘못 구현하게 되면 속도가 저하되고 일관성이 없어질 수 있다.

Querysets


image.png

쿼리셋은 쉽게 말하자면 전달받은 모델의 객체 목록이다.

다음부터 장고걸스 튜토리얼을 보면서 따라해보는 연습이다.
1. 모든 객체 조회하기

python manage.py shell
from blog.models import Post
Post.objects.all()

장고에서 python shell을 연 다음 모델에서 포스트를 임포트해온다.
모든 객체를 불러오려면 all()을 사용한다.

  1. 객체 생성하기
Post.objects.create(author=me, title='sample', text='test')

이 부분에서 작성자로서 User 모델의 인스턴스를 가져와 전달해준다. 먼저 User 모델을 불러온다.

from django.contrib.auth.models import User

me = User.objects.get(username = 'ola')
Post.objects.create(author =me, title='sample', text='test')
  1. 필터링하기

쿼리셋의 중요한 기능은 데이터르르 필터링하는 것. 예를 들어, ola가 작성한 모든 글을 찾고 싶다고 하면

Post.objects.filter(author=me)

모든 글 중에 제목에 title이라는 글자가 들어간것만 보고 싶다면

Post.objects.filter(title__contains='title')

게시일로 과거에 작성한 글을 필터링하면 목록을 불러올 수 있다.

from django.utils import timezone
Post.objects.filter(published_date__lte = timezone.now())
post = Post.objects.get(title = 'sample')
post.publish()

Post.objects.filter(published_date__lte =timezone.now())
  1. 정렬하기
Post.objects.order_by('created_date')

Post.objects.order_by('-created_date') #내림차순
  1. 쿼리셋 연결하기
Post.objects.filter(published_date__lte = timezone.now()).order_by('published_date')

ref : https://tutorial.djangogirls.org/ko/django_orm/

profile
졸꾸 !!!

0개의 댓글