💡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에서 정의된 메소드임
'데브코스 > TIL' 카테고리의 다른 글
[TIL] 4주차_Day13: Django 프레임워크를 사용해서 API서버 만들기(3) (1) | 2023.11.04 |
---|---|
[TIL] 4주차_Day12: Django 프레임워크를 사용해서 API서버 만들기(2) (1) | 2023.11.03 |
[TIL] 3주차_Day10: 파이썬 웹 크롤링(5) (1) | 2023.11.01 |
[TIL] 3주차_Day9: 파이썬 웹 크롤링(4) (0) | 2023.11.01 |
[TIL] 3주차_Day8: 파이썬 웹 크롤링(3) (0) | 2023.10.31 |