본문 바로가기

데브코스/TIL

[TIL] 4주차_Day11: Django 프레임워크를 사용해서 API서버 만들기(1)

💡Today I Learned

  • 파이썬 장고 프레임워크를 이용한 API 서버 만들기의 첫 번째 강의를 진행했습니다.
  • 장고 개발 환경 설정
  • django project, app, model, admin, shell 개념 및 실습

 


 

1. Django project 생성하기

: Django = 파이썬으로 제작된 웹 프레임워크

: 장고를 구동시킬 가상환경을 만들고 프로젝트별로 관리 (for 충돌 방지)

: managy.py - 장고 프로젝트를 터미널에서 조작할 수 있는 명령을 제공함

 

(기본 명령어)

a. 가상환경 생성

python -m venv [가상환경 이름]

 

b. 가상환경 활성화

source [가상환경 이름]/bin/activate

 

c. 가상환경 비활성화

deactivate

 

d. 새로운 Django 프로젝트 생성하기

django-admin startproject [실행할 프로젝트 이름]

 

e. 생성한 프로젝트를 서버에서 실행하기

python manage.py runserver

 

2. Django app 생성하기

: 프로젝트 == 하나의 웹 사이트

:  == 웹 사이트를 구성하는 개별적 기능

: 따라서 하나의 프로젝트 여러 개의 앱으로 구성됨

        *) 앱은 하나의 프로젝트에만 속하는 것은 아님 (하나의 기능(앱)은 다른 사이트에서도 동작 가능)

 

: 웹서버 → url 요청 들어왔을 때 웹 페이지를 응답 내려줌

 

3. URL 경로(Path) 설정하기

: 127.0.0.1:8000/앱/더 들어가기/.. → 에 해당하는 페이지의 view 구현하기

: 해당 앱의 url_pattern에 추가 후 views.py에 해당하는 메소드 구현하기

 

4. 모델 만들기

: 여러 개의 글&작성자 → DB에 저장돼있음 → Django는 DB에서 값을 읽어 화면에 표시 == 모델!

: 모델 : 테이블 = 1 : 1

: app의 model.py → DB를 하나의 테이블로써 코드에서 읽어들임 (ORM, Django의 모델 과 같은 애구나)

 

(기본 명령어)

a. 모델 만든 후 테이블로 만들기 위해 migration 생성

        *) 주의할 점: setting.py에 [모델을 만든 앱의 configuration]을 INSTALLED_APPS 리스트에 추가해주기

python manage.py makemigrations [모델을 만든 앱 이름]

 

b. migration 내용 확인: 테이블을 만든 SQL문을 확인할 수 있음

python manage.py sqlmigrate [모델을 만든 앱 이름] [migration 번호]

 

c. migration 실행 → 최종적으로 테이블 만들기

python manage.py migrate

 

5. 모델의 필드(Field) 타입 추가해보기

: BooleanField - 불린값

: CharField - 문자열

: DateField - 날짜

: DateTimeField - 날짜, 시간

: FloatField - 실수

: JSONField - json형식으로 데이터 저장

: TextField - char보다는 긴 문자열

: etc...

 

*) 마이그레이션(Migration): 모델의 변경 내역을 DB *스키마에 적용시키는 장고의 방법

*) DB 스키마(Schema): DB 내에서 데이터가 저장되는 구조와 제약 조건을 정의한 것. 장고로 치면 하나의 어플리케이션의 models.py 파일

 

a. 모델의 변경 사항  마이그레이션 생성(makemigration)  마이그레이션을 테이블에 반영(migrate)

python manage.py makemigrations
python manage.py migrate

 

b-1. Django 기본 DB(SQLite3)에서 테이블의 변경 사항 확인 (after migration)

sqlite3 db.sqlite3

 

b-2. 존재하는 테이블 확인 (ls같은)

.tables

 

b-3. 접속 후에는 SQL문 사용 가능 *) 주의할 점: 끝에 세미콜론(;) 필수

SELECT * FROM django-migrations;

 

b-4. 테이블 스키마 확인

.shema [테이블 이름]

 

b-5. sqlite3 터미널 종료하기

ctrl+D

 

c. migration 되돌리기

        *) 주의할 점: 롤백한 migration은 지워주기, 해당 내용 역시 models.py에서 수정해주기

python manage.py migrate [앱 이름] [migration 번호]

 

 

6. Django admin

: 시스템 관리자가 데이터 수정, 추가하는 페이지

: 우리가 만든 모델을 기반으로 데이터 CRUD 기능 제공

 

a. 관리자 생성: 만들어진 사용자(관리자)는 관리자 페이지인 '127.0.0.1:8000/admin'에 접속해 로그인 가능

python manage.py createsuperuser
[username 입력]
[email, pwd 입력]

 

b. 또다른 admin 사용자 추가

: 관리자(Admin) 페이지에 접속해 새로운 유저를 만들고 Staff/Superuser Status 추가하기

 

7. 어드민(Admin)에 만든 모델 등록

a. model을 만든 app에서 admin.py 수정

admin.site.register([모델 이름])

 

8. 장고 쉘(Shell)에서 모델 활용하기

: 장고 쉘 = 파이썬 쉘과 유사

 

a. 쉘 실행

python manage.py shell

 

b. 모델 활용하기 전 불러오기(import): 만든 전체 모델 다 import (*)

from [앱 이름].models import *

 

c. 모델의 object 확인하기 (in shell)

[모델 이름].objects().all()

 

*) 주의할 점: shell은 변경사항 바로바로 적용 x, 따라서 껐다가 다시 켜줘야 함

d. 쉘 종료 명령어

exit()

 

9. 장고에서 제공하는 timezone

from django.utils import timezone
timezone.now()

 

10. 장고 쉘에서 데이터(레코드, object) 생성하기

: admin 페이지에서 +Add 버튼으로 object 생성  쉘에서 진행하기

: 장고 쉘에서 직접 [모델이름]() 생성자 이용해 레코드 생성

: 외래키를 참조하는 모델의 경우 [참조하는 모델].[모델이름]_set.create() 로 레코드 생성

 

a. Question 객체 하나 가져오기

q1 = Question.objects.all()[0] # 방법 1
q1 = Queston.objects.first() # 방법 2 / .last()

 

b-1. Question 만들기 & 저장하기

from django.utils import timezone

q3 = Question(question_text="abc")
q3.pub_date = timezone()
q3.save()

 

c-1. Choice 만들기(1): Question 객체 이용하기

q3.choice_set.all()  # q1 객체를 외래키로 하는 Choice 객체 전체 보기
q3.choice_set.create(choice_text="a")  # choice_set의 create로Choice 객체 생성

# 만든 객체 저장
choice_a = q1.choice_set.all()[0] # 방법 1
choice_a = q1.choice_set.first() # 방법 2
choice_a.save()

 

c-2. Choice 만들기(2): Choice 생성자에서 Question(외래키) 지정하기

choice_b = Choice(choice_text="b", question=q3)

# 만든 객체 저장
choice_b.save()

 

11. 장고 쉘에서 데이터(레코드, object) 수정/삭제하기

: 쉘에서 변경 후 .save() 명령을 통해 수정된 내용 저장

: 어드민 페이지에서 delete 버튼으로 삭제 (1)

: .delete() 명령을 통해 쉘에서 삭제 (2)  table에서 사라졌으므로 id값은 삭제됨 (메모리에는 남아있어서 choice.choice_text 등의 필드는 확인 가능)

 

a. q1과 연결된 모든 choice 삭제

q1 = Question.objects.first()
q1.choice_set.delete()

 

12. 모델에서 원하는 레코드들만 필터링(1)

: .get([원하는 조건]) _ 한 개의 레코드

q = Question.objects.get(pub_date__second=50)
q = Question.objects.get(question_text__startswith="휴가를")
q = Question.objects.get(id=1)

: *) 주의할 점: .get()으로 찾은 레코드가 한 개 이상일 때 에러 발생

 

: .filter([원하는 조건]) _ 두 개 이상의 레코드

: .filter().query _ DB에서 어떤 sql 쿼리문으로 가져오는지 확인

 

: <QuerySet>  vs  <Question>, <Choice>

: <QuerySet> return의 경우 .count() 가능 (여러 개의 레코드 리턴)

 

13. 모델에서 원하는 레코드들만 필터링(2)

: __contains = 포함

: __gt = greater than (~보다 큰)

: __lt = less than (~보다 작은)

: __regex = 정규표현식 넣어 필터링

: .filter().update() = 필터링 된 결과에만 값 업데이트

: .filter().delete() = 필터링 된 결과만 삭제

: .filter([조건1]).filter([조건2]) .. = 여러 개의 조건으로 필터링 가능

 

14. 모델 관계기반 필터링

: 기본키-외래키 관계 이용

: .filter() 내에서 (외래키를 참조하는 모델 이름__필드이름__조건=값)

: .exclude([조건]) = 조건에 해당하지 않는 레코드만 필터링

 

15. 모델 메소드

: .save() 메소드는 상속받은 models.Model에서 정의된 메소드임

반응형