데브코스-데이터엔지니어링

장고 활용한 API 서버 만들기

묠니르묘묘 2024. 4. 9. 10:22

Django Project 생성하기

$ django-admin startproject 프로젝트이름

 

Manage.py

  • Django 프로젝트를 터미널에서 관리할 수 있도록 명령어를 제공하는 기능의 파일

Django 서버 실행 명령어

$ python manage.py runserver

 

Django App 생성하기

$ python manage.py startapp polls
  • 특정한 기능을 수행하는 웹 어플리케이션으로 App들이 모여 하나의 Project가 됨
  • App은 하나의 웹 사이트만 종속되는 것이 아닌, 여러 사이트에서 그 기능을 할 수 있음
  • `urls.py` 에서 앱 경로를 지정할 수 있음

 

모델

  • 장고의 모델은 RDB에서 엔티티(테이블)라고 보면 됨
  • 모델을 통해 데이터를 편하게 관리 가능
  • 별도의 SQL 쿼리문 작성 없이 프로그래밍 언어로 데이터의 CRUD 가능

 

모델 생성

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

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

두 개의 테이블(엔티티)를 위 코드처럼 만듦.

기본키는 자동으로 AUTOINCREMENT 하는 정수형을 만들어줌.

 

migration 적용

모델을 생성했으면 스키마에도 구조가 변경된 것을 적용해야함.

$ python manage.py makemigrations polls
$ python manage.py sqlmigrate polls 0001

 

DB 내용 확인하기

$ sqlite3 db.sqlite3

장고의 DB는 기본적으로 sqlite3을 지원하기에 db.sqlite3 파일을 열어 확인 가능함

 

migration 롤백

$ python manage.py migrate polls 0001

 

Django Admin

  • 관리자들이 데이터를 추가하거나 수정하는 페이지
  • 장고에서는 생성한 모델에 대해 웹 페이지에서 데이터를 CRUD하는 기능 지원
  • `http://127.0.0.1/admin` 으로 접속 가능

 

관리자 계정 생성하기

$ python manage.py createsuperuser

 

모델 등록하기

from django.contrib import admin
from .models import Question, Choice

# Register your models here.
admin.site.register(Question)
admin.site.register(Choice)
  • admin이 접근할 수 있도록 코드 추가함
  • App 폴더의 admin.py에 위 코드를 추가함
  • 이후 admin 페이지에서 손쉽게 등록 가능

 

Django shell

$ python manage.py shell

 

장고의 쉘로 접속하려면 위 명령어를 터미널에서 입력함.

 

모델 사용하기

>>> from polls.models import *

#모든 Question,Choice 오브젝트 가져오기
>>> Question.objects.all()
>>> Choice.objects.all()

#첫번째 Choice 오브젝트 가져오기
>>> choice = Choice.objects.all()[0]
>>> choice.id
>>> choice.choice_text
>>> choice.votes

#첫번째 Choice와 연결된 Question 가져오기
>>> choice.question
>>> choice.question.pub_date
>>> choice.question.id

 

Django로 웹서비스를 하고, 글로벌 서비스를 수행한다면 파이썬에서 제공하는 `datetime` 모듈보다는 `timezone` 을 사용하자

 

새로운 모델 생성하기

#create() 메서드를 활용하여 q3와 연결된 새로운 Choice 오브젝트를 생성하고, choice_text 필드에 값을 넣어주기
>>> q3.choice_set.create(choice_text = "b")

#새로운 Choice 오브젝트를 생성하고 question 필드에 q3 값을 넣어 연결하기
>>> choice_c = Choice(choice_text='c', question=q3)

#새로운 Choice 오브젝트를 데이터베이스에 저장하기
>>> choice_c.save()

 

레코드 수정 및 삭제하기

>>> from polls.models import *

#Question 오브젝트 중 가장 마지막으로 만들어진 것을 가져오기
>>> q = Question.objects.last()

#해당 오브젝트의 question_text에 새로운 내용을 더해 수정하기
>>> q.question_text = q.question_text + '???'

# DB에 수정내용 적용하기
>>> q1.save() #Choice 오브젝트 중 가장 마지막으로 만들어진 것을 가져오기
>>> choice = Question.objects.last()
>>> choice.queston.choice_set.all()
<QuerySet [<Choice: a>, <Choice: b>, <Choice: c>, <Choice: d>]>

#해당 오브젝트를 삭제하기
>>> choice.delete()
>>> choice.queston.choice_set.all()
<QuerySet [<Choice: a>, <Choice: b>, <Choice: c>>

 

모델 필터링

>>> Question.objects.get(id=1)
<Question: 제목: 휴가를 어디서 보내고 싶으세요?, 날짜: 2024-04-07 14:34:00+00:00>

# '휴가를' 로 시작하는 행 찾기
>>> q = Question.objects.get(question__startswith='휴가를 ')
>>> q
<Question: 제목: 휴가를 어디서 보내고 싶으세요?, 날짜: 2024-04-07 14:34:00+00:00>
  • 한 개만 가져올 때는 `.get()` 사용

 

>>> Question.objects.filter(pub_date__year=2024)
<QuerySet [<Question: 제목: 휴가를 어디서 보내고 싶으세요?, 날짜: 2024-04-07 14:34:00+00:00>, <Question: 제목: 가장 좋아하는 디저트는?, 날짜: 2024-04-07 14:34:22+00:00>, <Question: 제목: 커피 vs 녹차, 날짜: 2024-04-08 05:43:35.350925+00:00>, <Question: 제목: abc???, 날짜: 2024-04-08 05:45:30.479683+00:00>]>
  • 여러 개가 반환된다면 `.filter()` 사용
  • 이 경우, QuerySet 이라는 집합으로 결과를 반환함