Programming Blog

11. 장고 ORM과 쿼리셋(QuerySets) 본문

Python

11. 장고 ORM과 쿼리셋(QuerySets)

Go-ong 2019. 1. 25. 17:55

장고 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

게시글 하나가 추가된 것을 확인할 수 있다.

필터링 하기

쿼리셋의 중요한 기능은 데이터 필터링이다. 예를 들어, User가 작성한 글을 찾고 싶으면 Post.objects.all()에서 
all 대신, filter를 사용한다. 쿼리셋 안에 있는 괄호 안에 원하는 조건을 넣어준다.
이 경우엔 작성자나 나 인 조건을 넣어야한다. 이걸 장고로 표현한다면 author-me 가 된다.


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'이라는 글자가 들어간 글들만을 뽑아내고 싶으면

1
2
>>> Post.objects.filter(title__contains='title')
[<Post: Sample title>, <Post: 4th title of post>]
cs

※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

그리고 publish 메서드를 사용하여 게시한다.
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() 명령을 입력하여 쉘을 종료한다.

'Python' 카테고리의 다른 글

Python 정규표현식 사용 List  (0) 2021.09.01
10. HTML 시작하기  (0) 2019.01.25
9, 장고 뷰 만들기  (0) 2019.01.25
8. 장고 urls  (0) 2019.01.25
7. 배포하기  (0) 2019.01.24
Comments