11. 장고 ORM과 쿼리셋(QuerySets)
장고 ORM과 쿼리셋(QuerySets)
장고를 데이터베이스에 연결, 데이터를 저장하는 방법을 알아본다.
쿼리셋이란?
쿼리셋(QuerySet)은 전달받은 모델의 객체 목록이다.
쿼리셋은 데이터베이스로부터 데이터를 읽고, 필터를 걸거나 정렬을 할 수 있다.
장고 쉘(shell)
로컬 콘솔에서 다음 명령을 입력한다.
1 | (myvenv) ~/djangogirls$ python manage.py shell | cs |
1 2 | (InteractiveConsole) >>> | cs |
이것은 장고 인터랙티브 콘솔(Interactive Console)로 들어온 것이다. 파이썬 프롬프트와 비슷하지만, 장고만의 마법을 부릴 수 있는 곳이기도 하다. 물론 파이썬의 모든 명령어도 사용 가능하다.
모든 객체 조회하기
글을 불러오고 먼저 입력했던 모든 글들을 아래와 같이 입력하여 출력한다.
1 | >>> from blog.models import Post | cs |
1 | >>> Post.objects.all() | cs |
그럼 포스트 했던 게시된 글 목록들이 나타난다.
근데 파이썬으로 새 글을 포스팅 하려면 다음과 같이 해야한다.
객체 생성하기
데이터베이스에 새ㅐ 글 객체를 저장하는 방법
1 | >>> Post.objects.create(author=me, title='Sample title', text='Test') | cs |
작성자로서 User(사용자) 모델의 인스턴스를 가져와 전달해줘야 하므로 먼저 User 모델을 불러온다.
1 | >>> from django.contrib.auth.models import User | cs |
데이터베이스에서 user는 어떤 역할인지 확인하는 코드는 아래와 같다
1 2 | >>> User.objects.all() <QuerySet [<User: ola>]> | cs |
슈퍼 유저로 등록했었던 사용자가 나온다 그 사용자의 인스턴스를 가져오는 코드는 아래와 같다.
1 | >>> me = User.objects.get(username='User이름') | cs |
사용자이름이 User이름 인 User 인스턴스를 받아왔다. 사용자 이름을 바꿨다면, 바뀐 이름을 넣어줘야 한다.
게시물 올리는 코드는 아래와 같다
1 | >>> Post.objects.create(author=me, title='Sample title', text='Test') | cs |
1 2 | >>> Post.objects.all() <QuerySet [<Post: my post title>, <Post: another post title>, <Post: Sample title>]> | cs |
1 2 | >>> Post.objects.filter(author=me) [<Post: Sample title>, <Post: Post number 2>, <Post: My 3rd post!>, <Post: 4th title of post>] | cs |
모든 글 중 제목(title) 에 'title'이라는 글자가 들어간 글들만을 뽑아내고 싶으면
※title과 contains 사이에 있는 밑줄은 2개이다. 장고 ORM은 필드 이름과 연산자와 필터를 밑줄 2개를 사용하여 구분한다.
게시글 목록을 볼 수 있다. 게시일(published_date) 로 과거에 작성한 글을 필터링하면 목록을 불러올 수 있다.
1 2 3 | >>> from django.utils import timezone >>> Post.objects.filter(published_date__lte=timezone.now()) [] | cs |
하지만 파이썬 콘솔에서 추가한 게시물은 보이지 않는다. 먼저 게시하려는 게시물의 인스턴스를 얻어야 한다.
1 | >>> post = Post.objects.get(title="Sample title") | cs |
1 | >>> post.publish() | cs |
다시 게시된 글의 목록을 가져온다.
1 2 | >>> Post.objects.filter(published_date__lte=timezone.now()) [<Post: Sample title>] | cs |
정렬 하기
쿼리셋은 객체 목록을 정렬할 수 있다. 이제 created_date 필드를 정렬할 것이다,.
1 2 | >>> Post.objects.order_by('created_date') [<Post: Sample title>, <Post: Post number 2>, <Post: My 3rd post!>, <Post: 4th title of post>] | cs |
- 을 맨 앞에 붙여주면 내림차순 정렬도 가능하다.
1 | >>> Post.objects.order_by('-created_date') | cs |
쿼리셋 연결하기
쿼리셋들을 함께 연결할 수 있다.
1 | >>> Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date') | cs |
이 방법은 복잡한 쿼리도 작성할 수 있게 해준다
exit() 명령을 입력하여 쉘을 종료한다.