들어가기 앞서...
-본문은 DB 테이블 관계와 CRUD를 함께 정리했다. 따라서 본문을 이해하기 위해서는 두 키워드를 개별적으로 이해하기 보다 두 내용을 함께 탐색하는 것이 처음 이해하기에 더 적합하다고 본다.
보완이 필요한 내용
- 객체가 지원하는 다양한 메소드 사용방법(objects.add, objects.filter, 등)
DB 테이블의 관계 Relationship
(책 리뷰 목적의 앱 생성한다. 앱에서는 여러 책들, 여러 출발사와, 기여자들의 DB 테이블 존재한다.)
앱 이름 : reviews
테이블 종류 : Book, Publisher
- models.py 에 추가한 클래스들을 웹 페이지상에서 보기 위해서 admin.py 에 명시한다

1:N 관계
- 테이블의 여러 레코드에서 다른 테이블의 레코드를 참조하는 것을 1:N 관계라고 한다.
- 해당 관계에서 외래 키를 사용(foregin key)으로 다른 레코드를 참조한다.
- 예시) (현실세계)한 책을 어떤 출판사가 출간할 때, 해당 책에는 출간해준 출판사가 들어가야 한다.
(DB에서) Book 이라는 레코드에서 Publisher 레코드를 참조한다.
(코드에서) ForeginKey 로 해당 레코드 참조.

- 외래키(ForeginKey)사용 시에는 null 값을 지정해주는 것이 좋다.
어떤 상황에서 지정해주는 것이 좋을까?
기존의 책 레코드는 출판사와의 관계가 없이 생성되어있었다.
그런데 책 레코드에 출판사와의 관계를 지정하고 적용하려고 마이그래이션 생성 및 적용시, 기존의 레코드에는 출판사와의 관계가 없기 때문에 아래 그림처럼 해당 값을 지정할건지, 아니면 소스를 수정할건지 물어본다.

위 상황에서는 null값을 True 로 주면 위 질의가 나오지 않는다.
N:M 관계
- 2권의 책을 서로 다른 기여자들이 기여할 수 있다.
- A라는 기여자가 BOOK1, BOOK2를 만드는데 기여할 수 있고, B라는 사람도 BOOK1,BOOK2,BOOK3를 만드는데 기여 가능하다
- 이를 N:M 관계라고 한다.

- N:M 관계를 지정해주기 위해 참조되는 클래스인 Book 클래스에 참조하는 클래스를 ManyToManyField로 선언해준다.
contributors = models.ManyToManyField('Contributor', through='BookContributor')
through : N:M 옵션으로 중개 테이블을 통해 관계를 설정한다는 의미이다.
- 중개 테이블은 BookContributor 사용하며 해당 중계테이블에서 Contributor를 외래키로 사용한다
- 만약 N:M(다대다) 관계를 설정하면서 trough 옵션을 사용하지 않는다면 중계테이블 자동 생성된다
1: 1관계
- 기여자에게 필요한 자격증이 존재한다. (1:1 관계)

- OneToOneField 로 1대1관계를 정의해준다
- 웹 페이지에서 확인하면, 자격증 테이블에서는 기여자를 선택해 자격증 데이터를 생성 가능하다. 반대로 기여자 테이블에서는 자격증을 선택해 데이터를 생성 불가능하다.
DB 사용자를 선택 가능한 테이블 데이터 옵션으로 테이블 생성하기

-(조건) from django.contrib import auth #선언 필요
- auth.get_user_model() 은 DB 사용자를 선택옵션으로 정의한다.

Django ORM의 CRUD
- CRUD 란? [Create 생성] / [Read, Retrieve 읽기,인출] / [Update 갱신] /[ Delete, Destroy 삭제, 파괴] 으로, SW 가지는 기본적 데이터 처리 기능을 의미한다.
- Django ORM은 SQL을 사용하지 않아도 동일한 기능을 제공한다
- 작업 수행 공간은 파이썬 터미널을 통해 작업을 수행한다.
- 작업 수행공간으로 진입 방법
1. 파이참 터미널에서 python manage.py shell 입력
2. 파이참 좌측 하단 파이썬 아이콘으로 파이썬 터미널 사용
CRUD – Create

CRUD – Update

CRUD – Create() 메소드 이용

CRUD – 외래 키로 객체 생성
- Book 객체, create()메소드, publisher객체로 Book 데이터 추가
- Book 테이블 데이터 추가시 필요한 외래 키를 publisher 객체로 받아 사용한다.

CRUD – 외래 키로 객체 생성
- N:M 관계에 있는 BookContributor에 데이터 추가한다
- BookContributor는 Book, Contributor 데이터로 만들어야 한다.


CRUD – add() 메소드로 N:M 관계

- Book, Contributor 클래스로부터 한 데이터씩 가져와 객체에 넣은 후, 해당 객체들과 add메소드로 BookContributor 데이터 생성하기

CRUD – read
- publisher 클래스의 데이터를 read 하기 위해서는 여러 가지 방법 존재
-
- get 메소드 사용

- 여러 객체 조회 – filter 사용


- all() 메소드 사용 집합 검색


Update() 메소드 사용한 기존 레코드 업데이트
- lastname이 김민초인 레코드의 first_name을 초코나무숲으로 변경
Delete() 메소드 사용한 기존 레코드 삭제
