models.ForeignKey(on_delete={})

models.ForeignKey(참조할 모델, on_delete={참조하는 인스턴스가 삭제될 시 해당 인스턴스를 처리하는 방법})

on_delete 옵션은 해당 인스턴스가 참조하는 인스턴스가 삭제되었을 시, 해당 인스턴스를 어떻게 처리할지를 지정한다. 

 

1) models.CASCADE

해당 인스턴스가 참조하는 인스턴스가 삭제된 경우, 해당 인스턴스도 같이 삭제한다. 

 

2) models.PROTECT

해당 인스턴스가 참조하는 인스턴스를 삭제하려고 할 때 ProtectedError를 발생시킨다. 

 

3) models.RESTRICT

해당 인스턴스가 참조하는 인스턴스를 삭제하려고 할 때 RestrictedError를 발생시킨다. 

 

두 옵션 모두 에러를 발생시키지만 서로 다르다. 

 

 

🗒️PROTECT와 RESTRICT 옵션의 차이점

해당 인스턴스 A, 해당 인스턴스가 참조하는 인스턴스 B, B가 참조하는 또 다른 인스턴스 C라고 하자.

이때 A는 B, B는 C 인스턴스를 참조하므로, A와 B는 ForeignKey 필드를 갖고 있다. 

 

[1] on_delete=PROTECT 인 경우

A는 on_delete=PROTECT, B는 on_delete=CASCADE라고 해 보자. 

 

B를 삭제하려고 한다면 A의 on_delete=PROTECT 옵션 때문에 B가 삭제되지 않고 ProtectedError가 발생한다. 

C를 삭제한다면, B는 on_delete=CASCADE 이므로 원래는 같이 삭제되어야 한다. 

그러나 B를 참조하는 A는 on_delete=PROTECT 이므로 B는 삭제될 수 없다. 

따라서 C를 삭제하려고 해도 ProtectedError가 발생한다. 

 

[2] on_delete=RESTRICT 인 경우

A는 on_delete=RESTRICT, B는 on_delete=CASCADE라고 해 보자. 

 

B를 삭제하려고 한다면 A의 on_delete=RESTRICT 옵션 때문에 B가 삭제되지 않고 RestrictedError가 발생한다.

C를 삭제한다면, B는 on_delete=CASCADE 이므로 같이 삭제된다. 

즉 RESTRICT 옵션은 직접적으로 B를 삭제하는 것은 제한하지만, B가 참조하는 다른 인스턴스에 의해서 B가 삭제되는 것은 제한하지 않는다. 

 

4) models.SET_NULL

해당 인스턴스가 참조하는 인스턴스가 삭제될 경우, 해당 인스턴스의 값을 NULL로 바꾼다. 

이때, 반드시 해당 인스턴스의 옵션이 null=True 으로 되어있어야 한다!

 

5) models.SET_DEFAULT

해당 인스턴스가 참조하는 인스턴스가 삭제될 경우, 해당 인스턴스의 값을 Default로 지정된 값으로 바꾼다. 

그러려면 반드시 해당 인스턴스의 default 값이 지정되어 있어야 한다!

 

6) models.SET({value})

해당 인스턴스가 참조하는 인스턴스가 삭제될 경우, 해당 인스턴스의 값을 SET 안의 값으로 바꾼다.

그러려면 반드시 SET의 괄호() 안에 값을 지정해 주어야 한다. 

 

7) models.DO_NOTHING

별다른 추가 처리를 하지 않는다. 

 

 

참고한 포스트

Model field reference | Django documentation | Django (djangoproject.com)

 

+ Recent posts