DevHyun

[DevHyun's Blog] Django ORM과 QuerySet 그리고 동적데이터 활용 본문

Web/Django&Python Blog Projecct

[DevHyun's Blog] Django ORM과 QuerySet 그리고 동적데이터 활용

D3V3L0P3R 2020. 10. 19. 13:46

장고걸스 코치들과 자원봉사자들의 수고로 번역된 글을 참고하였습니다.

 

tutorial.djangogirls.org/ko

 

 

Django ORM(Object Relational Mapping)은 OOP 언어와 데이터를 다루는 RDBMS 와의 상이한 시스템을 매핑하여, 데이터 관련 OOP 프로그래밍을 쉽게 하도록 도와주는 기술 입니다.

 

Django QuerySet은 전달받은 모델의 객체 목록입니다. 데이터베이스로부터 데이터를 읽고, 필터를 걸거나 정렬을 할 수 있습니다.

 

1. pycharm terminal에서 Django Shell 사용하기

* Shell 이란?

shell 은 운영체제의 커널과 사용자 사이를 이어주는 역할을 합니다. 커널이란 운영체제의 일부로서 컴퓨터의 메모리에 항상 떠있는 하나의 프로그램입니다. shell은 상용자의 명령어를 해석하고 운영체제가 알아들을 수 있게 지시해줍니다. 다시 운영체제는 shell 에게서 받은 지시를 해석하여 하드웨어를 위한 지시어로 바꾸어 줍니다. 예를 들어 운영 체제를 엔진과 트랜스미션이라고 할 때 shell은 운전석의 계기판이라고 생각할 수 있습니다.

python manage.py shell

(InteractiveConsole) 진입!

 

2. 모든 객체 조회하기->에러 발생

* shell은 일시적이기 때문에 terminal 종료시 import한 내역들이 초기화됨. 다시 선언해주어야 함.

Post.objects.all()

Traceback (most recent call last):
               File 
"<console>", line 1, in <module>
NameError: name 
'Post' is not defined

 

3. models.py Import 하기

* 대소문자 주의!

from Blog.models import Post

 

4. 모든 Post 출력하기

* admin 페이지에서 Post 작성한 이력이 있으면 출력

Post.objects.all()

<QuerySet [<Post: Post 1>, <Post: Post 2>]>

 

6. 객체 생성하기(Post 쓰기!)

* Models의 user Import 후 Filtering

* 작성자로서 User(사용자) 모델의 인스턴스를 가져와 전달해줘야 합니다.

* post 제목

* post 내용

 

from django.contrib.auth.models import User

User.objects.all()
enter
-> <QuerySet [<User: devhyun>]>

me = User.objects.get(username='devhyun')

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

7. 테스트 용으로 다른 게시자로 몇개 더 추가해보기

admin = User.objects.get(username='admin')
Post.objects.create(author=admin, title='Sample title', text='Test')

admin1 = User.objects.get(username='admin')
Post.objects.create(author=admin,1 title='Sample title', text='Test')


 

7. Post 확인

* 새 Post 추가

Post.objects.all()

<QuerySet [<Post: Post 1>, <Post: Post 2>,  <Post: Sample Title>, <Post: Post 3>, <Post: Post 4>]>

 

8. 작성자로 Filtering 하기!

Post.objects.filter(author=me)
<QuerySet [<Post: Sample Title>]>

 

9. Title 내용으로 Filtering 하기

*title와 contains 사이에 있는 밑줄(_)이 2개(__)입니다. 장고 ORM은 필드 이름("title")과 연산자과 필터("contains")를 밑줄 2개를 사용해 구분합니다. 

Post.objects.filter(title__contains='title')
<QuerySet [<Post: Sample Title>]>

 

10. Published_date 로 Filtering 하기

* timezone util Import 후 Filtering

from django.utils import timezone

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

 

11. terminal에서 입력한 Post가 없을경우 Filtering 결과가 없음.

* terminal에서 입력 시 published_date가 입력됨.

 

12. 기존 Post(admin 페이지에서 테스트로 입력했던 post)를 객체로 저장 후 다시 게시하기(Published_date 입력)

 

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

* publish 전

 

* publish 후

 

 

 

13. Queryset들을 Changiling도 가능!

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

 

14. Shell 나가기

exit()

 

Comments