이끼의 생각

Django Web (13) 장고 ORM과 쿼리셋 본문

파이썬 장고 웹 프레임워크

Django Web (13) 장고 ORM과 쿼리셋

IKKIson 2019. 5. 25. 03:50

이번 편은 장고의 데이터베이스 연결하여 데이터를 저장하는 방법을 알아보겠습니다.




쿼리셋(QuerySets) 이란?


쿼리셋(QuerySets)은 전달받은 모델의 객체 목록을 말합니다. 쿼리셋은 데이터베이스로부터 데이터를 읽고, 필터를 걸거나 정렬 등을 할 수 있습니다.


이제부터 블로그 앱 예제와 함께 실습해보겠습니다.




장고 쉘


로컬 콘솔을 열고 아래의 명령어를 입력하세요.


> python manage.py shell


//스샤



명령어가 실행되면 아래처럼 나올겁니다.


(InteractiveConsole)

>>>



여러분은 이제 장고 인터랙티브 콘솔(interactive console)로 들어왔습니다. 파이썬 프롬프트와 비슷하지만, 장고만의 마법을 부릴 수 있는 곳이기도 하지요. 물론 파이썬의 모든 명령어를 여기서 사용할 수 있습니다.




모든 객체 조회하기


이전에 블로그에 저장했던 모든 글들을 지금 보고있는 콘솔에서 출력해볼겁니다. 아래처럼 순서대로 차근차근 천천히~~ 입력하세요.


>>> Post.objects.all()

Traceback (most recent call last):

      File "<console>", line 1, in <module>

NameError: name 'Post' is not defined


//스샷



정상적으로 따라 했으면 에러가 떴을 겁니다. 에러 메시지를 보면 Post가 정의되있지 않다고 되있는데, 파이썬의 모든 명령어를 사용할 수 있다고 했죠?? 네! import를 먼저 하지 않아서 발생한겁니다. 


Post 모델을 import 하여서 에러없이 실행하게 해봅시다!


>>> from blog.models import Post


//스샷



이제 Post모델을 blog/models 에서 불러왔으니 다시 모든 글들을 출력을 해보겠습니다.


>>> Post.objects.all()

<QuerySet [<Post: my post title>, <Post: another post title>]>


//스샷



게시된 글 목록이 나타났습니다. 장고 관리자 인터페이스에서 함께 만들었던 겁입니다. 이제 이것들을 파이썬으로 새글을 포시팅해볼겁니다.




객체 생성하기


데이터베이스에 새 글 객체를 저장하는 방법에 대해 알아보겠습니다.


>>> Post.objects.create(author=me, title='Sample title', text='Test')


//스샷



이 명령을 실행하기 전에 해줄것이 있습니다.


우선, 뭔가 빼먹을 것이 입습니다. me 인 '나' 를 빼먹었네여. 작성자로서 User(사용자) 모델의 인스턴스를 가져와 전달해줘야 합니다. 어떻게 해야할까요?


먼저 User모델을 불러옵니다.


>>> from django.contrib.auth.models import User



데이터베이스에서 user는 어떤일을 할까요? 한번 알아보겠습니다.


>>> User.objects.all()

<QuerySet [<User: ola>]>



우리가 슈퍼유저로 등록했던 그 사용자의 id 가 나오네요!! 이제 이 사용자의 인스턴스(instance)를 가져오겠습니다.


>>> me = User.objects.get(username='ola')


//스샷



이렇게 사용자이름(username)이 'ola'인 User 인스턴스를 받아왔어요. 사용자 이름을 바꿨다면, 바뀐 이름을 넣어줘야겠죠.


드디어 이 명령을 실행하여 우리 게시물을 만들겠습니다!!


>>> Post.objects.create(author=me, title='Sample title', text='Test')


//스샷



잘 따라와주셨습니다. 이제 제대로 실행됬는지 조회를 하여 확인해보겠습니다.


>>> Post.objects.all()

<QuerySet [<Post: my post title>, <Post: another post title>, <Post: Sample title>]>


아까와 비교해보면, 목록엑 게시글 하나가 더 추가됬습니다.




복습!! 글 더 추가하기


점점 웹을 만드는 재미를 느끼실겁니다. 어렵지만 재밌고 할맛이 나죠. 글들을 몇개더 추가해보셔서 잘 작동되나 확인하고 복습해보세요. 이제 다음 내용으로 가겠습니다.




필터링하기


쿼리셋의 중요한 기능은 바로 데이터를 필터링하는 겁니요. 예를 들어, 우리는 ola라는 사용자가 작성한 모든 글을 찾고 싶다고 해볼게요. 이런 경우 Post.objects.all()에서 all대신, filter를 사용합니다. 쿼리셋 안에 있는 괄호 안에 원하는 조건을 넣어줄 거예요. 지금 이 경우에는 작성자(author)가 나(me)인 조건을 넣어야겠죠. 이걸 장고로 표현한다면 author=me가 됩니다. 이제 이 조건이 반영된 코드를 볼까요.


>>> Post.objects.filter(author=me)

[<Post: Sample title>, <Post: Post number 2>, <Post: My 3rd post!>, <Post: 4th title of post>]


//스샷



모든 글들 중, 제목(title) 에 'title' 이라는 글자가 들어간 글들만을 뽑아내서 보고 싶다면??


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

[<Post: Sample title>, <Post: 4th title of post>]


잠깐! title와 contains 사이에 있는 밑줄(_)이 2개(__)입니다. 장고 ORM은 필드 이름("title")과 연산자과 필터("contains")를 밑줄 2개를 사용해 구분합니다. 밑줄 1개만 입력한다면, FieldError: Cannot resolve keyword title_contains라는 오류가 뜰 거예요.


//스샷



게시글 목록을 볼 수 있습니요. 게시일(published_date)로 과거에 작성한 글을 필터링하면 목록을 불러올 수 있습니요.


>>> from django.utils import timezone

>>> Post.objects.filter(published_date__lte=timezone.now())

[]


//스샷



안타깝게도, 파이썬 콘솔에서 추가한 게시물은 아직 보이지 않네요. 하지만 바꿀 수 있어요! 먼저 게시하려는 게시물의 인스턴스를 얻어야 해요.


>>> post = Post.objects.get(title="Sample title")


//스샷



그리고 publish메서드를 사용해서 게시합시다!


>>> post.publish()


//스샷



이제 (위쪽 화살표 버튼 3번을 누르고 enter를 눌러) 다시 게시된 글의 목록을 가져와 봅시다.


>>> Post.objects.filter(published_date__lte=timezone.now())

[<Post: Sample title>]


//스샷





정렬하기


퀘리셋은 객체 목록을 정렬할 수 있어요. 이제 created_date필드를 정렬해봅시다.


>>> Post.objects.order_by('created_date')

[<Post: Sample title>, <Post: Post number 2>, <Post: My 3rd post!>, <Post: 4th title of post>]


//스샷



-을 맨 앞에 붙여주면 내림차순 정렬도 가능해요.


>>> Post.objects.order_by('-created_date')

[<Post: 4th title of post>,  <Post: My 3rd post!>, <Post: Post number 2>, <Post: Sample title>]


//스샷





쿼리셋 연결하기


쿼리셋들을 함께 연결(chaining)할 수 있어요.


>>> Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')


//스샷



이 방법은 정말 강력해 복잡한 쿼리도 작성할 수 있게 해준답니다.


좋아요! 이제 다음 내용으로 넘어갈 때로군요! 다음 명령을 입력해, 쉘을 종료하세요.


>>> exit()

$


//스샷






**출처 및 참고**

[블로그] 초보몽키님의 개발공부로그

[Wikidocs] 핀코인님의 Django 자습

[프로그래머스] 정두식님의 장고를활용한 웹사이트만들기 동영상강의

[오픈소스튜로리얼] Quasar Beyond님의 Django : Python WebFrameWork 동영상강의

[장고걸스공식] 이수진님 외. 장고걸스 튜토리얼 한국어번역

[장고걸스공식] 이수진님 외. 장고걸스 튜토리얼 심화 한국어번역

장고 공식 Document Tutorial

Comments