본문 바로가기
IT관련/Python

[python] Django의 ForeignKey Field에 대해서 ! (feat. on_delete의 종류 및 역할)

728x90

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 !! 정말 많이 사용하니 ! 꼭 알아두도록 합시다 !! 

 

다음에는 더 유용한 정보들로 찾아뵙겠습니다 ! 

 

 

 

 

 

 

728x90