10 분 소요

제 5강: API 사용하기

5.1. shell을 사용한 magage.py 접속 및 사용

interactive shell을 사용하여 manage.py를 접속하는 방법은 다음과 같다.

python manage.py shell

manage.py를 사용하지않고자 한다면 DJANGO_SETTINGS_MODULE을 다음과 같이 설정해야 한다.

DJANGO_SETTINGS_MODULE=mysite.settings
python
import django
django.setup()

터미널에서 쉘에 진입한 후 기존에 만들어진 polls.models API를 다음과 같이 호출한다.
이후 Class objects를 사용하여 새로운 Question을 생성한다

In [1]: from polls.models import Question, Choice # model을 호출 

In [2]: Question.objects.all()# system에 존재하는 Question을 조회한다.
Out[2]: <QuerySet []>

In [3]: from django.utils import timezone # timezone.now()를 사용하여 새로운 Question을 생성한다.

In [4]: q=Question(question_text='What is new post?', pub_date=timezone.now())

In [5]: q.save() # 메모리상의 Question을 실제 저장한다.

In [6]: q.id # 저장된 Question의 id를 호출한다.
Out[6]: 1

In [7]: q.question_text # 저장된 Question의 필드를 호출한다.(출력: What is new post?)
Out[7]: "What is new post?"

In [8]: q.question_text="What's up?" # 저장된 Question의 필드(question_text, pub_date)를 수정한다.

In [9]: q.pub_date=datetime.datetime(2022,8,5,17,20,46,744557,tzinfo=timezone.utc) # 오늘은 8월 7일이다. 데모를 위해 5일로 설정

In [10]: q.save()

In [11]: Question.objects.all() # system에 존재하는 Question을 조회한다
Out[11]: <QuerySet [<Question: Question object>]>

다음과 같은 <Question: Question object>에서 얻을 수 있는 쿼리의 정보가 없기에 Choice모델에 __str__()디스크립터를 사용하여 객체의 정보를 추가한다. 추가적으로 was_published_recently를 정의해 pub_date가 최근에(1일내) 저장된 것인지 확인한다.

import datetime
from django.db import models
from django.utils import timezone

class Question(models.Model):
    #....
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    
    def __str__(self):
        return self.question_text

class Choice(models.Model):
    #....        
    def __str__(self):
        return self.choice_text

작업된 내용을 저장하고 다시 쉘에서 조회한다.

In [1]: q.was_published_recently() #5일로 설정하였으므로 False
Out[1]: False

In [2]: q.pub_date
Out[2]: datetime.datetime(2022, 8, 5, 17, 20, 46, 744557, tzinfo=datetime.timezone.utc)

In [3]: from django.utils import timezone

In [4]: q.pub_date=timezone.now()

In [5]: q.save()

In [6]: q.was_published_recently()
Out[6]: True

다음은 만들어진 API데모를 이용한 CRUD 연습이다.

>>> from polls.models import Question, Choice

# 조금 전에 추가한 __str__() 메소드가 출력한 내용을 확인하십시오.
>>> Question.objects.all()
<QuerySet [<Question: What's up?>]>

# 장고는 키워드 인수를 이용한 강력한 데이터베이스 검색 API 를 제공합니다.
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>
>>> Question.objects.filter(question_text__startswith='What')
<QuerySet [<Question: What's up?>]>

# 올해 개제된 질문을 검색해봅시다.
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?>

# 존재하지 않는 ID를 검색하면 에러 메세지가 출력됩니다.
>>> Question.objects.get(id=2)
Traceback (most recent call last):
    ...
DoesNotExist: Question matching query does not exist.

# 데이터베이스의 기본키로 검색하는 것이 가장 보편적이기에
# 장고는 기본키 검색 쇼트컷 (shortcut) 을 제공합니다.
# 밑의 코드는 Question.objects.get(id=1)와 같습니다.
>>> Question.objects.get(pk=1)
<Question: What's up?>

# 이번에는 우리가 만든 커스텀 메소드가 잘 실행되는지 확인합시다.
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True

# Question에 2개의 Choice를 추가해보죠. create 콜은 새로운 Choice 오브젝트를 만들고,
# 데이터베이스의 INSERT 구문의 역할을 하며, 새로운 choice를 기존의 choice 세트에 추가 하고,
# 새로 만든 Choice 오브젝트를 리턴합니다. (한 문장이 엄청 기네요;;)
# 장고는 외래키 관계의 반대편 오브젝트의 세트를 가지고 있습니다.
# (e.g. question이 가지고 있는 choice 세트) 이것들은 API를 통해 액세스할 수 있습니다.
>>> q = Question.objects.get(pk=1)

# 기본키가 1인 Question 오브젝트가 관계하고 있는 choice 세트를 출력해 봅시다. -- 아직 아무것도 없습니다.
>>> q.choice_set.all()
<QuerySet []>

# 3개의 choice를 추가해보죠.
>>> q.choice_set.create(choice_text='Not much', votes=0)
<Choice: Not much>
>>> q.choice_set.create(choice_text='The sky', votes=0)
<Choice: The sky>
>>> c = q.choice_set.create(choice_text='Just hacking again', votes=0)

# Choice 오브젝트는 자신이 관계하고 있는 Question 오브젝트에 액세스할 수 있는 API를 가지고 있습니다.
>>> c.question
<Question: What's up?>

# 반대로 Question 오브젝트도 Choice 오브젝트에 액세스할 수 있는 API를 가지고 있습니다.
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()
3

# API는 자동으로 모든 관계를 추적합니다.
# 더블 언더스코어를 사용하여 관계를 연결합니다.
# 이것은 제한 없이 원하는 만큼 연결할 수 있습니다.
# pub_date가 올해인 모든 Choice 오브젝트를 검색하여 봅시다.
# (위에서 만든 변수인 'current_year'를 다시 사용합시다.
>>> Choice.objects.filter(question__pub_date__year=current_year)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>

# delete()을 사용하여 이 중 하나의 choice를 삭제해 보죠.
>>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
>>> c.delete()
(1, {u'polls.Choice': 1})
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>]>

태그:

카테고리:

업데이트:

댓글남기기