Web/django

(Django) ORM과 QuerySets

스퀴시 2020. 8. 13. 00:36
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