Django

Django ORM(Querysets)

nyanguk 2021. 1. 18. 22:52

장고를 데이터 베이스에 연결하고 데이터를 읽고 쓰는(저장) 방법에 대해 알아본다. 

 

ORM(Object Relationship Model)

 장고에서는 데이터를 객체화 한다.  객체화 된 데이터들은 Model Manager를 통해 데이터베이스와 상호작용하게된다.

class 를 배울때 그 안의 멤버로서 정보가 존재하는 것처럼 객체화된 데이터들도 동일한 방식으로 데이터의 세부사항들을 객체내에 구현한다. 

Querysets

쿼리셋을 이야기 하기전 objects 는 질의연산의 인터페이스 역할을 한다.objects  사용하여 다수의 테이터를 포함하는 객체가 반환될때 그 객체를 쿼리셋이라한다. 즉 전달받은 모델의 객체 목록이라 할 수 있다. 

 

데이터 조회하기

로컬의 터미널 창을 열어 아래 명령어를 입력한다.

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

 

당연히 가상환경을 실행시킨 산태에서 다음의 명령어를 입력하면 아래와 같은 결과를 얻을 수 있다. 

 

(my) jaeuk@jaeuk-cat:~/JaeUk/Django$ python manage.py shell
Python 3.7.0 (default, Jun 28 2018, 13:15:42) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from blog.models import Post
>>> Post.objects.all()
<QuerySet [<Post: 튜토리얼>, <Post: 가짜뉴스에 대한 나의 생각>]>
>>> 

데이터 생성하기

데이터를 생성하기 전에 웹페이지에서 글을 작성할 때를 떠올려 보자 수퍼유저로 로그인한 다음  author을 결정했다. 

그렇다면 (InteractiveConsole) 창에서 새로운 데이터(새 글)을 만들때 author을 어떻게 결정해줄까?

바로 User의 정보가 담긴 User 모델을 불러오면 된다.

 

>>> from django.contrib.auth.models import User
>>> User.objects.all()
<QuerySet [<User: nyanguk>]>

 

이로써 수퍼유저를 불러올 수 있고 객체 생성시  author로 결정 할수 있게 되었다.

 

author를 me라는 변수에 저장하는 방법과 post를 생성하는 방법은 아래와 같다.

me = User.objects.get(username ='nyanguk')
Post.objects.create(author=me, title='Django는 어때?', text='재밌엉!')

 전체 코드는 아래와 같다.

(InteractiveConsole)
>>> from blog.models import Post
>>> from django.contrib.auth.models import User
>>> me = User.objects.get(username ='nyanguk')
>>> Post.objects.create(author=me, title='Django는 어때?', text='재밌엉!')
<Post: Django는 어때?>

 

여기서 다시 데이터 조회를 해보면?

>>> Post.objects.all()
<QuerySet [<Post: 튜토리얼>, <Post: 가짜뉴스에 대한 나의 생각>, <Post: Django는 어때?>]>

성공적으로 Post가 생성된 것을 확인 할수 있다.

 

 

쿼리셋에 필터 적용하기

데이터의 반환인 쿼리셋에 조건을 주어 특정 데이터들만 반환 할수 있는 방법은 filter를 사용하는 것이다.

먼저 ORM의 필드이름과 필터에 필요한 연산자 사이에는 _(밑줄)이 두개가 필요하다. 필드이름__연산자

 

필터링 하기

  • 내 이름으로 된 Post  찾기
>>> Post.objects.filter(author=me)
<QuerySet [<Post: 튜토리얼>, <Post: 가짜뉴스에 대한 나의 생각>, <Post: Django는 어때?>]>
  • title에 '뉴스'가 포함된 Post찾기
>>> Post.objects.filter(title__contains='뉴스')
<QuerySet [<Post: 가짜뉴스에 대한 나의 생각>]>

참고로 Post안에는 author, author_id, created_date, id, published_date, text, title 항목이 존재하므로 연산자만 알고 있다면 위 필드의 정보로 filtering할 수 있을 것이다.

 

정렬하기

>>> Post.objects.order_by('created_date')
<QuerySet [<Post: 튜토리얼>, <Post: 가짜뉴스에 대한 나의 생각>, <Post: Django는 어때?>]>
>>> Post.objects.order_by('-created_date')
<QuerySet [<Post: Django는 어때?>, <Post: 가짜뉴스에 대한 나의 생각>, <Post: 튜토리얼>]>

order_by 메소드를 통해 특정 필드 값을 기준으로 오름차순 또는 내림차순으로 정렬할 수 있다.

내림차순은 필드명 앞에 '-'를 붙인다.