관계형 데이터 베이스에는 One To One, One To Many, Many To Many가 있다.
A칼럼의 1개의 열과 B열의 1개의 열이 대응이 되는 구조로 가장 단순한 구조이다.
Aquery툴을 사용해서 만들게 되면 이런 형식 Category의 Menu_id column 단 한개만 관계를 가지고 있다.
이런식으로 models.py에서 사용할 수도 있다.
1:1의 관계로 이루어지기 때문에 관계설정하는데 있어 크게 어려움을 가질 필요는 없다.
A열의 1개의 행과 B열의 다수의 행이 관계가 있는 형태이다.
Aquery 의 형태로 나누면 이렇게 할 수 있다.
이런식으로 Drink,Nutirion필드를 보면 drink_id 1개당 Nutrition의 여러개의 열들이 대응이 되어 있다.
Foreignkey.on_delete : Foreginkey가 참조하는 객체가 사라지게 되면 django는 on_delete인수로 지정된 SQl 제약조건의 동작들을 에뮬레이트 합니다. 그리고 그 다음에 원하는 행동을 적어주면 됩니다.
CASCADE : 계단식 삭제로 ForeginKey로 물려있는 객체도 삭제합니다.
PROTECT : 참조된 객체의 삭제를 방지합니다. ProtectError 발생
RESTIRCT : 그 자체로의 삭제는 방지하지만, CASCADE의 삭제는 지워진다.
SET_NULL : null_True로 나두게 되면 참조되어 있는 행이 삭제 되어도 null값으로 남아있다.
SET_DEFAULT : 마찬가지로 참조되어있는 행이 삭제될 시 default 값으로 변경
Related_Name : 관련개체에서 이 개체 까지의 관계에 사용할 이름입니다.
우선 Aquery로 만든 형태를 보면 이런식으로 하게 된다.
ManyToMany 필드는 M:M으로 이루어진 다대다 관계이다. 설명하면 한 개의 음료가 여러개의 알러지를 가질 수 잇고 한 개의 알러지는 여러개의 음료를 가질 수 있는 관계이다.
자칫 생각 하면 One To many와 헷갈릴 수 있다. 하지만 잘 생각 해보면 다르기 때문에 데이터베이스 모델링을 할때 생각을 잘 해봐야 할 것이다. (One To Many인지, Many To Many!!!!)
Aquery에서 Allergy_Drink는 중간테이블로서 Allergy와 drink를 ManyToMany로 연결하는 것을 도와 준다.
이런식으로 작성을 해주면 된다.
위의 사진에는 Allergy_Drink라고 중간 필드가 만들어 져 있는 것을 볼 수 있다.
이 중간에 중개해주는 필드를 관련해서 1)만들어도 되고 2)안 만들어도 된다.
Django는 Allergy_Drink와 같은 중개해주는 필드와 관련해서 '자동'으로 만들어 준다.
그럼 무슨 차이 일까?
중간필드에 우리가 원하는 데이터를 CRUD할수 있냐 없냐의 차이이다. 그래서 되도록이면 만드는 것을 추천한다.
그리고 또 한가지
ManyToManyField 속성은 연결되는 두 Field 간에 한 쪽에만 있어야 한다. 어느쪽이 주가 되는 지에 따라 주가되는 필드에 정의하는 것이 좋다.
그래서 Drink의 필드가 Allergy 필드보다 주가 되기때문에 Drink 에 allergy 필드를 만들었다.
through : ManyToManyField가 사용할 model을 지정할 수 있게 해준다.
through_field : 연결된 필드에서 ManyToMany필드로 연결한 필드를 정의 해준다.