반응형
Notice
Recent Posts
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Today
Total
관리 메뉴

H-Log

[python] Django API 사용하기 본문

dev-log/python

[python] Django API 사용하기

hong6v6 2023. 1. 30. 22:32
반응형

API란 개발자가 필요로 하는 데이터를 불러올 수 있도록, 혹은 데이터베이스에 새로운 데이터를 넣을 수 있도록 만든 함수라고 생각하면 됩니다.

우선, python shell에 진입하여 그 shell 내에서 작업해보자

py manage.py shell

그리고 우리가 만든 Choice와 Question모델을 import하자

from polls.models import Choice, Question

Data 출력

아래 명령어로 모델의 목록을 확인할 수 있다

Question.objects.all()
--> <QuerySet []>

현재는 아무것도 없으니 빈 list가 출력된다.

Data 생성

Question에는 ‘질문’과 ‘발행일’이 있었다.

발행일을 넣어주기 위해서 timezone 라이브러리를 import 하고, q라는 변수에 질문과 발행일을 담는다

그리고 저장

rom django.utils import timezone
q = Question(question_text="What's new?", pub_date=timezone.now())
q.save()

q가 잘 저장됐는지 확인하기 위해 id값을 출력해보자

id값은 직접 넣지 않아도 django에서 자동으로 넣어준다.

q.id
--> 1

id 뿐만 아니라 질문과 발행일도 볼 수 있다.

q.question_text
--> "What's new?"
q.pub_date
--> datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.timezone.utc)

Data 변경

데이터 변경도 가능하다

q.question_text = "What's up?"
q.save()

q.question_text
--> "What's up?"

Data 확인

데이터를 모두 확인해보면 객체를 표현하는 데 별로 도움이 되지 않게 나온다

Question.objects.all()
--> <QuerySet [<Question: Question object (1)>]>

. polls/models.py파일의 Question모델을 수정하여, [__str__()](<https://docs.djangoproject.com/ko/4.1/ref/models/instances/#django.db.models.Model.__str__>) 메소드를 Question 과 Choice에 추가해 봅시다.

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__()](<https://docs.djangoproject.com/ko/4.1/ref/models/instances/#django.db.models.Model.__str__>) 메소드를 추가하는것은 객체를 편하게 보려는 이유 말고도,

Django 가 자동으로 생성하는 관리자 사이트에서도 객체가 사용되기 때문입니다.

이 모델에 커스텀 메소드 또한 추가해봅시다:

하루 전 날짜, 시간과 비교하여 1일 이내면 최근 발행물로 표시할 수 있는 함수를 추가했습니다.

import datetime

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

# 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
    
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

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

완료 후 cmd창에 ctrl+z로 shell을 나간 후, 재진입해줍니다.

py manage.py shell
from polls.models import Choice, Question

그리고 다시 Question 전체 확인을 해보면 아까와 다르게 출력됨을 알 수 있습니다.

Question.objects.all()
--> <QuerySet [<Question: What's Up?>]>

Data filter

django docs에서 다양한 함수를 사용할 수 있다

예시

id값이 1번인 데이터를 불러오기

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

question_text가 ‘What’으로 시작하는 데이터 불러오기

Question.objects.filter(question_text__startswith='What')
--> <QuerySet [<Question: What's up?>]>
반응형

'dev-log > python' 카테고리의 다른 글

[python] Django Database 사용  (0) 2023.01.30
[python] Django Admin Page  (0) 2023.01.30
[python] Django Database 사용  (0) 2023.01.30
[python] Django 프로젝트 생성  (0) 2023.01.30
[python] Django 가상서버 생성 및 진입  (0) 2023.01.30
Comments