[Django] Django Model
1. 개요
⎣ models.py에서 백엔드 언어(자바, 파이썬 ...)로 데이터베이스를 관리함
► SQLite
- 오픈소스 RDBMS 중 하나이며 django의 기본 DB로 사용됨
- DB가 파일로 존재하며 가볍고 호환성이 좋음
2. Model
► django Model
- DB의 테이블을 정의하고 데이터를 조작할 수 있는 기능들을 제공
- 테이블 구조를 설계하는 '청사진(blueprint)'
► model 클래스 작성과 이해
from django.db import models
# 테이블을 어떻게 설계할지 생각하면 됨
# 나머지는 Model클래스가 가지고 있음!
# class의 특징은 '상속'
# 클래스 이름이 테이블 이름이라고 생각하기 : Article
class Article(models.Model): # models라는 모듈안에 Model클래스 존재
# Model클래스의 상속을 받아서 Article 진행
# 테이블 id 필드는 자동 생성
# 필드 이름[변수명] = models.데이터 타입[모델 필드 클래스](제약 조건)[모델 필드 클래스의 키워드 인자]
# 테이블 제목필드 ; models클래스의 charField 모델필드 호출
title = models.CharField(max_length=10) # CharField : 길이 제한
# 테이블 내용필드 ; models클래스의 TextField 모델필드 호출
content = models.TextField() # TextField : 길이 제한 X
# TextField는 길이 제한이 없기 때문에 max_length를 사용해도 의미 없음(공식문서에 있음)
► models.Model
- models.Model
- models 모듈의 Model이라는 부모 클래스를 상속 받아 작성
- model 기능에 관련된 모든 설정이 담긴 클래스(459~2477줄 코드를 상속 받아서 사용하는 것)
- 개발자는 테이블 구조를 어떻게 설계할 지에 대한 코드만 작성하도록 하기 위함
► 클래스 변수명
- title, content
- 테이블의 각 필드 이름
► model Field 메서드
- CharField, TextField
- 테이블 필드의 데이터 타입
- https://docs.djangoproject.com/en/3.2/ref/models/fields/
► model Field 메서드의 키워드 인자
- max_length=10
- 테이블 필드의 제약조건 관련 설정
3. Migrations
► Migrations
- model 클래스의 변경사항(필드 생성, 추가 수정 등)을 DB에 최종 반영하는 방법
► Migrations 과정
►Migrations 핵심 명령어
# models.py에 class작성 후 터미널 창에 입력
python manage.py makemigrations
# model class를 기반으로 설계도(migration) 작성
python manage.py migrate
# 만들어진 설계도를 DB에 전달하여 반영
► migrate 후 DB 내에 생성 된 테이블 확인
- python 으로 DB 조작
- 이 과정까지 sql을 사용하지 않고 DB 조작했다는 것을 알 수 있음
- db.sqlite3에 articles_article 테이블 확인
► 전체 흐름 : models.py → 0001_initial.py → db.sqlite3
Q. 이미 생성된 테이블에 추가 필드를 추가해야 한다면?
A. model class에 변경사항이 생겼다면, 반드시 새로운 설계도를 생성하고, 이를 DB에 반영해야 한다
model class 작성 및 수정 → makemigrations → migrate
► 추가 모델 필드 작성 흐름
① models.py 파일에 추가 모델 필드 작성
from django.db import models
# Create your models here.
class Article(models.Model):
title = models.CharField(max_length=10)
content = models.TextField()
# 추가 모델 필드 작성
created_at = models.DateTimeField(auto_now_add=True) # True로 설정했다는 것은 기본값이 False
updated_at = models.DateTimeField(auto_now=True)
CharField() | - 길이의 제한이 있는 문자열을 넣을 때 사용 |
max_length | - CharField의 필수 인자 - 필드의 최대 길이를 결정하는 max_length는 필수 인자 |
TextField() | - 글자의 수가 많을 때 사용 |
DateTimeField() | - 날짜와 시간을 넣을 때 사용 |
auto_now | - DateTimeField의 선택인자 - 데이터가 저장될 때마다 자동으로 현재 날짜시간을 저장 |
auto_now_add | - DateTimeField의 선택인자 - 데이터가 처음 생성될 때만 자동으로 현재 날짜시간을 저장 |
② 터미널에 python manage.py makemigrations 입력
⎣ 이미 기존 테이블이 존재하기 때문에 필드를 추가할 때 필드의 기본 값 설정이 필요
⎣ 1번은 직접 기본 값을 입력하는 방법
⎣ 2번은 현재 대화에서 나간 후 models.py에 기본 값 관련 설정을 하는 방법
③ 1번 선택 후 Enter
⎣ 추가하는 필드의 기본 값을 입력해야 하는 상황
⎣ 날짜 데이터이기 때문에 직접 입력하기 보다 django가 제안하는 기본 값을 사용하는 것을 권장
⎣ 아무것도 입력하지 않고 enter를 누르면 django가 제안하는 기본 값으로 설정 됨(timezone.now)
④ Enter 선택 후 변화 → 0002.auto_20230324_0136.py 생성
⎣ migrations 과정 종료 후 2번째 migration 파일이 생성됨을 확인
⎣ 기존에 생성해둔 0001_initial.py 파일의 dependencies 변수와 다른 부분들 집중해서 보기
⎣ 추가한 내용 0002.auto_20230324_0136.py 파일의 내용을 살펴보면 dependencies 변수에 내용이 추가 됨
⎣ 나머지 부분들 또한 추가 반영됨
⎣ db.sqlite3에도 필드가 추가되었는지 확인해야 하는데 살펴보니까 기존의 db.sqlite3는 아직 추가 필드이 반영이 되지 않음
⑤ 만들어진 설계도를 DB에 전달하여 반영 python manage.py migrate
⎣ 터미널 창에 python manage.py migrate 입력을 하면 db.sqlite3에 추가 필드이 반영이 됨
⎣migrate가 된 db.sqlite3에 추가 필드가 적용 되었는지 확인
4. Admin site
►Automatic admin interface
- django는 추가 설치 및 설정 없이 자동으로 관리자 인터페이스 제공
- 데이터 관련 테스트 및 확인을 하기에 매우 유용
► admin 계정 생성
python manage.py createsuperuser
- email은 선택 사항이기 때문에 입력하지 않고 진행 가능
- 비밀번호 생성 시 보안상 터미널에 출력되지 않으니 무시하고 입력을 이어가도록 함
⎣ 만든 user 데이터는 DB에 저장되어 있음
► DB에 생성된 admin 계정 확인
⎣ auth_user에 앞서 만든 user 데이터가 db.sqlite3의 auth_user에 저장되어 있음
⎣ password부분을 보면 유저가 설정한 비밀번호가 아니라 이상한 문자로 이루어져 있는데 보안상 문제로 원본을 저장하지 않기 때문!
⎣ 꼭 읽어보기! [암호화] https://d2.naver.com/helloworld/318732
► admin에 모델 클래스 등록
⎣ from .models import Articles : 명시적 상대경로
⎣ admin.site.register(Article) : 어드민 사이트에 등록한다!
① 서버 연결해서 사이트 접속한 후 로그인
② 로그인 하면 다음 화면 나타나는데 Articles 클릭
③ 데이터 CRUD 테스트 : ADD ARTICLE 클릭 → Title, Content 입력 후 SAVE
④ 저장 완료! 수정도 가능함
⑤ 실제 테이블에 저장되었다는 것도 확인
⎣ 위에 저장된 시간은 내가 만든 시간이 아니라 UTC 기준으로 저장하고 출력할 때는 내가 만든 시간으로 출력
⎣ 왜냐하면 사용자의 위치에 따라 시간이 다르기 때문
⎣ settings.py에서 확인 가능
⎣ LANGUAGE_CODE = 'ko-kr' 한국어로 변경하면 로켓 페이지, admin페이지,에러메세지 등 전부 한국어로 바뀜
5. 참고
► Migrations 기타 명령어 (선택 사항)
python manage.py showmigrations
- migrations 파일들이 migrate 됐는지 안됐는지 여부를 확인하는 용도
- [X] 표시가 있으면 migrate가 완료되었음을 의미
# 0001 설계도
python manage.py sqlmigrate articles 0001
# 0002 설계도
python manage.py sqlmigrate articles 0002
- 해당 migrations 파일이 SQL 문으로 어떻게 해석 되어 Db에 전달되는지 확인하는 용도
► 첫 migrate 시 출력 내용이 많은 이유는?
- 기본적으로 Django 프로젝트가 동작하기 위해 작성 되어있는 기본 내장 app들에 대한 migration 파일들이 함께 migrate 되기 때문
► 초기화
⎣ 만들어둔 py파일, db 삭제