TIL29. on_delete 옵션

Byoungju Park·2021년 8월 12일
2
post-thumbnail

on_delete 옵션은 참조하는 객체가 삭제되었을 때 해당 모델의 삭제 여부를 결정해주는 옵션이다.

1. CASCADE
모델 인스턴스를 같이 삭제시킨다.
예) 상품의 이미지 url을 담은 테이블이 있다.
Image 객체는 Product 객체를 참조하는 1:N 관계이다. 어떤 상품의 판매 중단으로 DB에서 해당 상품을 삭제한다면, 관련된 이미지도 남아있을 필요가 없다. 따라서 Image 객체의 product 필드는 CASCADE 옵션을 줄 수 있다.

class Image(models.Model):
	product = models.ForeignKey("Product", on_delete=models.CASCADE)

2. PROTECT
ForeignKeyField가 삭제되지 않도록 ProtectedError를 발생시킨다.

3. SET_NULL
해당 ForeignKeyField 값을 NULL로 바꾼다. null=True 옵션이 있을 때만 가능하다.
예) 최상위 카테고리에 [상의, 하의]가 있다. 서브 카테고리에 [긴팔, 반팔, 긴바지, 반바지]가 있다. 최상위 카테고리 Category <- 서브 카테고리 SubCategory <- 상품 Product는 1:N 관계이다. 최상위 카테고리가 삭제되어도 서브 카테고리는 남아있어야 한다. 서브 카테고리를 참조하는 상품이 있기 때문이다. Category 객체의 "상의" 필드가 삭제될 경우, SubCategory 객체의 참조필드 값을 null로 바꾸는 것이 적절하다.

class Category(models.Model):
	category = models.CharField(max_length=45)
    
class SubCategory(models.Model):
	category = models.ForeignKey("Category", on_delete=models.SET_NULL, null=True)
    	sub_category = models.CharField(max_length=45)
        
class Product(models.Model):
	sub_category = models.ForeignKey("SubCategory", on_delete=models.SET_NULL, null=True)

4. SET_DEFAULT
해당 ForeignKeyField 값을 미리 지정해놓은 default값으로 변경한다.

아래는 on_delete 옵션의 개념을 다른 사이트에서 쉽게 풀어놓아 붙여보았다.

CASCADE : "안녕 세상에, 나는 article_B 없이는 살 수 없다"고 자살한다.
PROTECT : "아니오! 제발! 하지마! 난 너 없이는 살 수 없어!"
SET_NULL : "좋아, 내가 너의 사람이 아니라면 난 아무도 아니야"
SET_DEFAULT, SET() : "괜찮아, 여분의 애인이있어, 지금부터 article_C를 참조 할 것이다"
DO_NOTHING : "나는 현실에 직면 할 수 없다, 그것이 나에게 남아있는 유일한 것이더라도 당신의 이름을 계속 부르겠다!"

참조
https://pythonq.com/so/python/6856

profile
wanna be good programmer

2개의 댓글

comment-user-thumbnail
2021년 8월 14일

여분의 애인이 있어 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 앜ㅋㅋㅋㅋㅋ

답글 달기
comment-user-thumbnail
2021년 8월 15일

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 병주님 블로그 꿀잼..

답글 달기