2월 17, 2022

[Django] ForeignKeyField on_delete

ForeignKey는 relation이 작동하는 방식을 정의하는 arguments를 받습니다.

ForeignKey로 참조되는 객체가 삭제됐을때, 장고는 on_delete argument가 지시한 대로 SQL동작을 모방할 것입니다. 

on_delete의 가능한 값들은 다음과 같습니다.

  • CASCADE
장고는 참조 된 오브젝트가 삭제되면 ForeignKey를 가지고 있는 object들(해당 오브젝트를 참조하는 오브젝트들) 을 삭제합니다. - 

  • PROTECT
참조된 객체의 삭제를 차단하고 ProtectedError를 발생시킵니다. 삭제하려면 수동으로 참조하는 모든 객체를 삭제해야 합니다.
  • RESTRICT
PROTECT와 유사한 동작입니다. RestrictedError를 발생시켜 참조된 개체의 삭제를 방지합니다. 
  • SET_NULL
ForeignKey를 null로 둡니다. 이 값은 필드에 null 이 입력 가능할때(null=True)에만 사용할 수 있습니다. 
ex) 주석이 사용자를 참조할 때, 사용자가 삭제되더라도 사용자가 게시한 주석은 익명의 사용자가 게시한 것으로 남아있습니다.
  • SET_DEFAULT
ForeignKey의 디폴트값을 설정합니다. 디폴트값은 반드시 설정돼야 합니다.
  • SET()
ForeignKey의 값을 SET()함수에서 설정한 대로 설정합니다. 
  • DO_NOTHING
말그대로 어떠한 액션도 취하지 않습니다. 참조 무결성을 해칠 수 있어서 권장되지 않습니다. 
실제로는 존재하지 않는 개체를 참조하는 문제가 발생할 수 있다는 뜻입니다.