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 : "나는 현실에 직면 할 수 없다, 그것이 나에게 남아있는 유일한 것이더라도 당신의 이름을 계속 부르겠다!"
여분의 애인이 있어 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 앜ㅋㅋㅋㅋㅋ