본문 바로가기
Web/django

(Django) ORM과 QuerySets

by 스퀴시 2020. 8. 13.
728x90
SMALL

QuerySet이란?

전달받은 model 객체 목록
  DB로부터 data를 읽고, filter를 걸거나 정렬 가능

 

Django shell 

장고는 장고 console을 통해서 DB의 모든 객체를 쉽게 조회할 수 있다.

#cmd

(myvenv) ~\django>python manage.py shell

실행 후,

#Django console

(InteractiveConsole)
>>>

- Post 객체 조회

-> Django는 DB 객체를 조회하기 위해서 import를 해줘야 한다.

    만약 import 없이 객체 조회를 시도하면, 아래와 같은 오류가 발생한다.

blog model로부터 Post를 import 하기

>>>from blog.models import Post

import한 후, Post.objects.all() 를 명령하면 모든 Post를 보여준다.

 

- Post 객체 생성

  Post객체를 생성하기 위해서, User model로부터 작가(user)를 가져온 후, create 해준다.

  User model은 생성하지 않아도 default로 django가 만들어 준다.

>>>from django.contrib.auth.models import User
>>> User.objects.all()
<QuerySet [<User: admin>, <UserL tester1>]>  // tester1은 admin page에서 생성했어요.
>>>tester1=User.objects.last()                     //tester1 변수에 담아주고 

>>>Post.objects.create(author=tester1, title='test2 title', content='testing') // post 생성
<Post: test2 title>

>>>Post.Objets.all()    //post 생성 확인
<QuerySet [<Post: test title>, <Post: test2 title>]>

위와 같은 과정으로 admin page가 아닌 Django Console로 Data를 조작할 수 있다.

 

- 생성한 객체 publish

>>> post = Post.objects.get(title="test2 title")  //Post model에서 title이 "test2 title"인 것을 가져와서
>>> post.publish()  //post 등록하기

 

- filtering

  -> QuerySet의 중요한 기능

  -> 특정 조건으로 검색하는 것

#작가로 검색
>>>Post.objects.filter(author=tester1)
<QuerySet [<Post: test title>, <Post: test2 title>]>

#title로 검색 (내용 포함)
>>>Post.objects.filter(title__contains='test2')   
                                               //Django ORM은 double underscore 를 통해서 field와 연산자를 구분
<QuerySet [<Post: test2 title>]>


filtering 예제

author를 기준으로 tester1과 admin 으로 filtering 한 검색 결과이다.

title__contains 예제

 

- 게시일로 filtering

>>> from django.utils import timezone
>>> Post.objects.filter(published_date__lte=timezone.now())
<QuerySet [<Post: test2 title>]> 

 

- 정렬

QuerySet으로 객체 목록을 정렬할 수 있다.

#오름차순
>>> Post.objects.order_by('created_date')
<QuerySet [<Post: test title>, <Post: test2 title>]>

#내림차순
>>> Post.objects.order_by('-created_date')
<QuerySet [<Post: test2 title>, <Post: test title>]>

 

- QuerySet 연결 (Chaining)

여러 QuerySet을 서로 연결해서 사용할 수 있다.

//모든 post를 created_date 순으로 정렬

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

<QuerySet [<Post: test title>, <Post: test2 title>]>

 

- QuerySet 종료

>>>exit()
LIST