9편 : https://heokknkn.tistory.com/17
안녕하세요 !
이번엔 9편에 이어서 ForeignKey에 대해서 좀 더 깊게 알아보겠습니다 !
먼저 ! 7편에서 간략하게 소개한적이 있는데요
외래키(Foreign Key)란?
외래키(Foreign Key)란 테이블의 필드 중에서 다른 테이블의 행과 식별을 할 수 있는 키를 의미합니다.
일반적으로 외래키가 포함된 테이블을 자식테이블 이라고 하고 , 외래키 값을 갖고 있는 테이블은 부모테이블 이라고 합니다.
즉 !! 외래키란 테이블과 테이블을 연결하기 위해서 사용되는 키라고 생각하면 됩니다 !!!
가장 편하게는 A라는 테이블에서 B테이블과의 뭔가의 관계를 나타 낼 때 ! 즉 A 테이블에서 B테이블의 ID라던가 고유의 값을 가지고 있는 것입니다 !
자 ! 일단 한번 밑에 처럼 봅시다 !
owner = models.ForeignKey(
"users.User",
related_name="communities",
on_delete=models.CASCADE,
verbose_name="그룹장",
)
저번에 했던것인데요 ! 저런식으로 입력을 하면 User의 정보를 Community에서 사용 할 수 있습니다 !
Community에서 User를 이용 할 수 있습니다 !
자 그러면 여기서 ForeignKey에 대해서 Option에 대해서 알아보겠습니다 !
https://docs.djangoproject.com/en/4.0/ref/models/fields/
공식문서에 정말 많은 options들이 있는데요 !
차례대로 알아보겠습니다 !
related_name
related_name ! 이건 개체 관계에 사용할 이름이며 ! 추상 모델에서 관계를 정의할 때 사용하는 이름을 의미합니다!!
저는 owner이라고 변수명을 지정하고 실제적으로 user테이블과의 관계가 있으니 user로 지칭했습니다 !
여기서 중요한 on_delete에 대해서 알아보겠습니다 !
on_delete의 옵션들 !
models.CASCADE | 외래키를 포함하는 요소도 삭제 |
models.PROTECT | 어떠한 요소를 삭제 할 때 그 삭제하는 대상과 관계가 있는 요소가 함께 삭제되지 않도록 해주며, 삭제하려면 관련 된 모든것들을 삭제해야합니다 ! |
models.SET_NULL | 외래키 값을 NULL로 변경 (null=True일 때 사용 가능) |
models.SET(function) | 외래키를 function 으로 수행( function는 함수 or 메서드 ) |
models.DO_NOTHING | 아무것도 안함 ! |
제가 CASCADE, PROTECT에 대해서 한번 테스트를 해보겠습니다 !
아래와 같이 kkana에 대해서 2개를 등록 해 놨습니다 !
참고로 그룹장에 대해서는 CASCADE상태로 등록 했습니다 !
그러면 kkana를 삭제해봅시다 !
kkana를 선택해서 Action에서 삭제를 해줍니다 ! django에서는 정말 간단하게 가능합니다 !!!
삭제를 하면 user에는 admin만 남아있습니다.
그럼 community로 가볼까요?
와우 !! 정말 communtiy에서는 관련 된 유저를 삭제하니 전부 삭제됐습니다 !!
잘 생각해보세요 ! 어떤 사람이 어떤 홈페이지를 탈퇴 했을 때 관련된 포인트라던가 사용하던 정보가 삭제되는 경우가 있습니다 !!
하지만 !!! 삭제를 하지 않는 경우도 있습니다 !! ( 예를 들어 카톡에서는 해당 유저가 탈퇴하면 (알수없음) 이라던가 해당 채팅방은 살아있습니다 ! ) 즉, 관련 된 것들은 일단 남기고 보는거죠 ! 그럴 때 PROTECT를 사용합니다 !
owner = models.ForeignKey(
"users.User",
related_name="communities",
on_delete=models.PROTECT,
verbose_name="그룹장",
)
이번엔 PROTECT로 바꿨습니다 !
그러고 나서 community를 등록 !
그러고 나서 다시 user에서 삭제를 해볼까요??
위에방식과 같습니다 !
짠 !!! 삭제를 하려면 관련 된 모든것들을 삭제하라고 나옵니다 !!!
너무 친절하게도 관련 된 항목들도 같이 나옵니다 !!
protect는 정말 유용하게 어떤 테이블에서 원하는 요소를 삭제 할 때 ! 관련 된 것들이 잇으면 경고같이 안내를 해주면 정말 편리하게 사용 할 수 있습니다 !!!
이렇게 on_delete에 대해서 알아봤는데요 !!!
CASCADE, PROTECT !! 정말 많이 사용하니 ! 꼭 알아두도록 합시다 !!
다음에는 더 유용한 정보들로 찾아뵙겠습니다 !