Model
index
모델이란??
Field가 하는 역할!! -> Field 덕에 타입명도 모두 python코드로 가능해진다!
모델링이란?
저장하고자 하는 데이터를 모델로 저장하는 것.
[ex]
실습
1. 기본세팅
장고프로젝트생성 - 가상환경설치 - 장고 설치 - config . 파일 생성.
2. 게시판을 위한 posts(App) 생성
config/settings.py -> app 추가
3. posts/models.py 작성하기
verbose_name : 관리자나 일반사용자들에게 노출될 필드에 대한 명칭을 지정.
4. 모델의 내용 명세하기.
$ python manage.py makemigrations
Pillow 패키지가 없다고 에러나는데, 이 패키지는 image 파일을 다룰때 사용하는 사용빈도가 높은 패키지이다.
$ pip install Pillow
Pillow 패키지 설치
다시 makemigrations로 명세 시키면,
migrations 에 새로운 파일들이 생성됨.
파일에 들어가보면, 실제 데이터베이스화 되기 전, 명세를 적어논 파일이라고 할 수 있다.
만들어질 테이블에 대한, Post방식인지(name=’Post’), id값은 어떤 형식(models. BigAutoField)인지 등…이 설정되어 있다.
5. 데이터베이스 생성
$ python manage.py migrate
6. 데이터베이스 사용자 넣고, 확인하기
$ python manage.py createsuperuser
username : admin
Email : 안써도됨
Password : 12(예시니까 짧게)
- SQLite 설치
db.sqlite3 -> 우클릭 -> open database
아래 만들어진 데이터베이스들 보임 우리가 방금 만든 auth_user 을 확인하면,
데이터가 들어와 있는걸 확인할 수 있다.
비밀번호는 해싱되어 들어가기 때문에, 저딴식임.
모델 관계
1:N 관계에서는 N이 되는 모델에 ForeignKey를 사용.
실습2
Python interpreter 설정
ctrl + shift + p -> 팔레트 검색
Python : Select Interpreter 선택.
Python 3.10.4(‘venv’:venv). 경로~ 선택
파이썬이 이 vscode에서 어떤 버젼으로 사용하라고 설정함으로써, 잡다한 오류를 줄일 수 있다.
models.py에 댓글관련 테이블 추가시키기
관계 매핑으로 확인하면,
작성자와 POST(게시글)은 1:N 관계이므로, N 에 해당하는 POST에서 1에 해당하는 작성자를 참고해야 하므로, writer에 외래키가 붙은 걸 알 수있다.
POST(게시글)와 Comment(댓글)은 1:N 관계이므로, N 에 해당하는 comment에서 1에 해당하는 post를 참고해야 하므로, post에 외래키가 붙은 걸 알 수있다. 또 작성자와의 관계도 1:N의 관계이므로, 마찮가지이다.
이 때, ForeignKey 속성에는 to 속성과, on_delete 속성은 필수이다.
to 속성 : 사용자 방식, on_delete: 삭제방식
추가시킨 후엔, 다시 명세 작업을 한다.
$ python manage.py makemigrations
새로운 명세 파일이, migrations에 생긴걸 확인할 수 있다.
추가된 내용에 관련된 제목으로 자동 생성된다.
이제 실제 DB table에 migrate해준다.
$ python manage.py migrate
QuerySet API를 이용해서, 데이터를 넣고, 확인하기
파이썬에 들어가기
$ from posts.models import Post
posts(앱)에 있는 models.py에서 Post모델(클래스)를 불러온다.
$ Post
Post 모델이 불러와 졌는지, 확인 -> class가 검색되면, 제대로 불러온것.
데이터베이스에 데이터 여러개 저장.
간단한 예시이므로, 필수 항목인 context만 입력함.
SQLite EXPLORER/ posts_post 에서 제대로 들어간것을 확인.
데이터 삭제
- 직접 삭제시
$ 모델명.objects.filter(id='id넘버').delete()
- 인스턴스 이용해서 삭제시
$ instance = 모델명.objects.get(id='id넘버') $ instance.delete()