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

0%

Writing your first Django app, part2 - 5편

API 가지고 놀기 - 2편


지난 포스팅에서, 쿼리셋을 조회 했더니, 아래와 같이 알수 없는 쿼리셋이 반환되서 나왔습니다.


1
2
3
In [14]: Question.objects.all() Out[14]: 

<QuerySet [<Question: Question object (1)>]>

Question object (1) 이라고만 표시되어 쿼리셋이 조회가 됩니다.


이렇게 조회가 되면, 이게 무슨 질문인지, 언제 생성된 질문인지 알수가 없어지게 되서. 전혀 유용하지 않은 정보가 됩니다.


이번 포스팅에서 이것을 어떻게 유용한 형태로 표시할것인지에 대한 과정을 진행 합니다.




모델 수정하기 __str__ 추가



우선, 문제를 해결하기 위해서 polls/models.py 를 수정해 줍니다.

__str__() 메써드를 Question 과 Choice 클래스에 추가를 해줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from django.db import models

# Create your models here.


class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')

def __str__(self):
return self.question_text


class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)

def __str__(self):
return self.choice_text


__str__ 메써드를 추가해주는것은 중요합니다. 인터렉티브 명령어에 대응할때에만 중요한것 뿐만 아니라,
Django 에서 자동으로 생성되는 관리자 페이지에서 표시되는 객체 내역들을 위해서도 중요합니다.


__str__ 을 추가 해주고 나서, 객체를 조회해 봅니다

python manage.py shell_plus 로 접속해서. 아래와 같이 조회해줍니다


1
2
In [1]: Question.objects.all()                                                                                                                                            
Out[1]: <QuerySet [<Question: 나 지금 뭐하고 있지?>]>

이전 포스팅에서 생성한 질문의 값을 제대로 반영한 데이터가 표시됩니다.



Custom 메써드 추가하기


커스텀 메서드도 (사용자 정의) Question 클래스에 추가해 봅니다



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from django.db import models

# Create your models here.

import datetime
from django.utils import timezone


class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')

def __str__(self):
return self.question_text

def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

import datetime 과 from django.utils import timezone을 가져오는것을 잊지 않습니다.

모델을 저장을 하고 shell_plus 로 접속해 봅니다.


python manage.py shell_plus


일단, 지난 포스팅에 튜토리얼과 상관없는 질문을 등록했었습니다. 튜토리얼에서는 “What’s up?” 이라고 썼었는데. 제가 ‘나 지금 뭐하고 있지?’ 라고 임의로 바꿨었습니다.


연습도 할겸, 다시 튜토리얼과 같은 질문으로 바꿔보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Question 중에서 id 값이 1번인것을 q에 저장 
In [1]: q = Question.objects.get(id=1)

# q 를 출력하면, 나 지금 뭐하고 있지? 가 출력됩니다
In [2]: q
Out[2]: <Question: 나 지금 뭐하고 있지?>

# q 에 존재하는 question_text 를 "What's up?" 으로 바꾸어 줍니다.
In [3]: q.question_text = "What's up?"

# save() 함수를 호출해서 데이터베이스에 저장합니다.
In [4]: q.save()

# q를 출력하면, 바뀐 question_text 를 가진 "What's up?" 이 출력됩니다.
In [5]: q
Out[5]: <Question: What's up?>


DATABASE API 실험하기



모델을 저장하고, 질문값을 다 바꾸었으면, 이제부터 DATABASE API 실험에 들어갑니다 .


__str__ 동작 확인


1
2
3
4
5
# __str__() 메써드가 잘 작동하는지 확인 
# 이제 Question 이 알아볼수 있는 질문 'What's up?' 으로 표시됩니다.

In [1]: Question.objects.all()
Out[1]: <QuerySet [<Question: What's up?>]>

키워드 인자로 조회


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Django 는 다양한 키워드 인수로 동작하는 lookup API 를 제공합니다
# (id=1) 은 id 가 1번인것을 조회해서 보여줍니다
# "What's up?" 이 첫번째 질문이니, "What's up?" 이 나옵니다

In [2]: Question.objects.filter(id=1)
Out[2]: <QuerySet [<Question: What's up?>]>

# __startswith 는 무엇으로 시작하는지에 대한 필터 입니다
# question_text__startswith='What' 은 question_text 중에 'What' 으로 시작하는것을 조회해서 보여줍니다

In [3]: Question.objects.filter(question_text__startswith='What')
Out[3]: <QuerySet [<Question: What's up?>]>


# 이번년도에 등록된 질문에 대해서 조회합니다 ([4] - [6])

In [4]: from django.utils import timezone

In [5]: current_year = timezone.now().year # current_year 에 timezone.now().year 를 사용, 이번년을 저장

In [6]: Question.objects.get(pub_date__year=current_year) # Question중 pub_date 이 이번년도와 같은것을 조회
Out[6]: <Question: What's up?>



마치며..



포스팅은 나누는것도 길어지는것도 별로 안좋아하지만..


너무 길어질것 같아서, 다시 나누어 포스팅 하려 합니다
다음 포스팅에 이어 합니다.