당신은 멋쟁이, 우리는 장고쟁이~

0%

Writing your first Django app, part2 - 4편

API 가지고 놀기


파이썬에 있는 인터렉티브한 쉘에 진입해서 DJango 가 제공하는 기본 데이터베이스 API 를 가지고 놀아봅니다.

Python shell 에 진입하기 위해서는 아래 커맨드를 사용합니다.


1
python manage.py shell


일반 shell 에 접속해서 할수도 있지만, 저는 shell_plus 를 사용해서 진행해 봤습니다.

shell_plus 를 사용하기 위해서는 django-extensions 를 설치하고, settings.py 에 INSTALLED_APPS 에 등록 해줘야 합니다.



Shell_plus 사용하기



django-extensions를 설치하고, settings.py 에 INSTALLED_APPS에 등록해주고, notebook도 설치해줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# django-extensions 설치 
pip install django-extensions

# mysite/settings.py INSTALLED_APPS 에 등록

INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',

'django_extensions',
]

# 그리고, notebook 도 설치해줍니다
# jupyter notebook 으로 Django shell_plus를 실행 시킬수 있지만, Django 3.0 부터 지원이 안되는것 같습니다.

pip install notebook

# 설치와 세팅을 마쳤으면, 아래 명령어로 Shell_plus 로 진입합니다
python manage.py shell_plus


아래 그림처럼 ln [1]: 이 화면에 나오면 됩니다.



shell_plus 에 진입했으면, database API 를 알아봅시다.



DATABASE API



여기서 얘기하는 DATABASE API 란

Django 가 제공하는 기능으로, 데이터베이스 추출 API 입니다.

사용자는 데이터베이스 객체를 생성하고, 읽어오고, 업데이트 하고 삭제할수 있습니다.



모델 다시 보기



첫번째로, 우리가 작성한 모델을 봐야 합니다. polls/models.py 에는 이미 작성된 모델들 Question, Choice 모델이 있습니다. 이걸 사용해서 데이터베이스 API 사용을 실습합니다.

작성한 모델을 다시 정리하자면,



모델명 필드 이름 데이터 타입
Question question_text Charfield
Question pub_date DateTimeField
Choice question ForeignKey
Choice choice_text CharField
Choice votes IntegerField

튜토리얼에서 진행하는 실습을 shell_plus 에 입력하면서 진행 해봅니다.



objects.all() 조회



1
2
3
from polls.models import Choice, Question     # 작성한 모델을 불러오기 

Quesiton.objects.all() # Question의 모든 객체를 조회하는 명령어


튜토리얼에서는, 다짜고짜 objects.all() 명령어를 실행 시켜서, 질문들이 없다는것만 보여주는데.. objects.all() 이 어떻게 생겨 나는것인지 짚고 넘어갑니다.


위에 테이블을 보면, 분명히 Question 은 모델명입니다. Question.objects.all() 을 사용해서 Question 의 모든 객체를 조회하는 것입니다. objects.all() 명령어는, 모델에 붙어 있는 모든 객체를 조회하고 쿼리셋을 반환합니다.


Choice 도 모델명인데, Choice.objects.all() 을 사용하면 어떨까요? 물론, Choice 에 있는 모든 객체를 조회하는 명령어가 됩니다.


현재 우리는, 어떠한 Question도, 어떠한 Choice 도 데이터베이스에 집어 넣지 않았기 때문에

objects.all() 명령어를 사용하면, 비어 있는 쿼리셋이 반환됩니다

아래 shell_plus 화면 참고


1
2
3
4
5
6
7
In [1]: from polls.models import Choice, Question                                                                                                       

In [2]: Question.objects.all()
Out[2]: <QuerySet []>

In [3]: Choice.objects.all()
Out[3]: <QuerySet []>

새로운 Question 생성하기



위에서 Question.objects.all() 로 모든 Question 들을 조회해보면, 비어 있는 쿼리셋이 나옵니다. Question 하나를 추가해 보겠습니다. Question 하나를 추가하기 위해서는,
모델에 나와 있는 두가지 필드들이 채워져야 합니다 (question_text 와 pub_date). 이중, pub_date 는 데이터 타입이 시간이기 때문에, 시간을 넣어줘야 합니다.

Django 는 time zone 을 지원하기 때문에, timezone.now() 를 사용하면 pub_date 에 들어갈 시간을 넣을수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
In [4]: from django.utils import timezone                                                                                                               

In [5]: q = Question(question_text="What's new?", pub_date=timezone.now())

# 객체를 데이터베이스에 저장합니다. save() 를 명시적으로 호출해서 저장합니다.
In [6]: q.save()

# q 가 데이터베이스에 저장 되었으니, 자동으로 id 값을 가집니다.
# 첫번째 데이터이니, id 값은 자동으로 1 이 됩니다.

In [7]: q.id
Out[7]: 1

q 라는 변수에 Question(question_text="what's new?", pub_date=timezone.now()) 객체 를 넣어주고. 그 객체 q를 저장 하였습니다. 이렇게 하면, 데이터베이스에 하나의 질문이 생성 됩니다.



생성된 데이터 접근하기



데이터가 하나 생성되었으니, 생성된 데이트를 접근할수도 있습니다.

위에서, q 라는 객체로 데이터베이스에 저장을 하였으니, 파이썬 속성을 사용하여, 필드 값에 접근 할수 있습니다.


위에서 q 는 Question(question_text=”What’s new?”, pub_date=timezone.now()) 였습니다.


q.question_text 에 접근하면, “What’s new?” 라는 텍스트를 반환합니다.

q.pub_date 에 접근하면, timezone.now() 의 값이 반환되겟죠?



1
2
3
4
5
In [9]: q.question_text                                                                                                                                 
Out[9]: "What's new?"

In [10]: q.pub_date
Out[10]: datetime.datetime(2020, 4, 13, 6, 58, 8, 963804, tzinfo=<UTC>)


생성된 데이터 값 바꾸기



속성값을 바꾸고, save() 를 호출함으로써, 데이터베이스에 저장된 값을 바꿀수도 있습니다.

위에서, “What’s new?” 라고 저장되었던 첫번째 질문을, “나 지금 뭐하고 있지?” 라는 질문으로 바꿔봅니다. (튜토리얼에서는 “What’s up? 이라고 바꾸는데.. 너무 비슷한 질문이라 헷갈립니다)



1
2
3
4
5
6
7
8
9
# q.question_text 값을 바꾸어줌 
In [11]: q.question_text = "나 지금 뭐하고 있지?"

# 바뀐 q 값을 데이터베이스에 저장
In [12]: q.save()

# 다시 q.question_text 에 접근
In [13]: q.question_text
Out[13]: '나 지금 뭐하고 있지?'

objects.all()로 다시 조회



objects.all() 을 사용하면 데이터베이스에 있는 모든 question 들을 출력해 줄겁니다.

이제까지 quesiton 한개를 데이터베이스에 저장해놓았으니, 1개가 출력됩니다.



1
2
In [14]: Question.objects.all()                                                                                                                         
Out[14]: <QuerySet [<Question: Question object (1)>]>



그런데, 이상하네요? 위에서 생성한 question 의 정보는 없고.
<Quetion: Question object(1)> 만 출력되어 나옵니다. 이러면, 이게 무슨 질문인지,
언제 생성된 질문인지 알수가 없어지게 됩니다.



데이터베이스가 이런식으로 조회가 된다면, 전혀 도움이 되지 않기때문에.
다음 포스팅에서 이것을 어떻게 유용한 형태로 출력할것인지 해결할겁니다.



마치며..



처음에 튜토리얼 진행하면서, 이 부분이 저언혀 이해가 안갔었습니다.

너무 생소했었습니다. 중요한 부분이라 생각하고, 파트를 나누어서 포스팅하기로 했습니다.


다음 포스팅에서 이어서 진행합니다. 아래는, shell_plus 전체 캡쳐 화면 입니다.