on_delete
"👩🏻💻이번에 제대로 알아두자."
지금까지는 과제규모의 소규모 프로젝트이다보니,
외래키를 사용할 때 on_delete=models.CASCADE를 사용해왔는데,
이번 프로젝트를 하면서 기능에 따라, 사용자의 요구사항에 따라 다른 옵션들을 줘야했다.
옵션을 올바르게 선택하려면, 어떤 경우에 어떤 옵션이 필요한지 정확히 이해 할 필요성을 느꼈다.
어떤 하나의 속성에서 ForeignKey로 바라보고 있는 객체(참조된 객체)가 삭제될 때,
참조하고 있는 해당 속성(참조하는 객체의 속성)이
어떠한 동작을 할 지(속성값을 처리하는 방법)에 대한 옵션
models.CASCADE
참조된 객체가 삭제될 때, 참조하는 객체도 삭제함
ex) 포스팅과 포스팅에 대한 댓글
models.PROTECT
참조된 객체를 삭제할 수 없도록 보호함
django.db.IntegrityError의 하위 클래스인 ProtectedError를 발생시킴
만일, 참조된 객제를 삭제하고 싶다면 수동으로 삭제해야 함
models.RESTRICT
-
ForeignKey로 바라보고 있는 객체(참조된 객체)를 삭제할 수 없도록 한다.
django.db.IntegrityError의 하위 클래스인 ProtectedError를 발생시키는 점은 PROTECT 와 같다.
만일 참조된 객체(A)에서 CASCADE 옵션으로 다른 객체(B)를 또 다시 참조하고 있었고,
객체 (B)와 객체(A)가 동시에 삭제되도록 같은 명령 안에서 수행된 경우라면
삭제를 예외적으로 허용한다.(의존성이 없어지기 때문에)
models.SET_NULL
ForeignKey로 바라보고 있는 객체(참조된 객체)가 삭제될 때,
참조하고 있는 해당 속성(참조하는 객체의 속성) 값을 null로 설정함
이 때, null=True라는 옵션을 추가해야함
models.DEFAULT
ForeignKey로 바라보고 있는 객체(참조된 객체)가 삭제될 때,
참조하고 있는 해당 속성(참조하는 객체의 속성) 값을
ForeignKey에서 미리 지정해놨던 default로 설정함
models.SET()
ForeignKey로 바라보고 있는 객체(참조된 객체)가 삭제될 때,
참조하고 있는 해당 속성(참조하는 객체의 속성) 값을
SET()으로 지정해놨던 값이나 메소드를 호출하여 반환된 값으로 설정함.
models.DO_NOTHING
ForeignKey로 바라보고 있는 객체(참조된 객체)가 삭제될 때,
참조하고 있는 해당 속성(참조하는 객체의 속성) 값을 바꾸지 않음
대신 이런 경우, 참조무결성이 성립하지 않기 때문에 IntegrityError가 발생할 수 있기 때문에,
ON_DELETE 제약조건을 넣어 위의 에러 발생을 방지할 수 있습니다.
이 글은 공식문서를 참고하여 작성하였습니다.
https://docs.djangoproject.com/en/4.0/ref/models/fields/#django.db.models.SET
'프레임워크(Framework) > Django' 카테고리의 다른 글
[Django] settings 파일 분리하기 (0) | 2022.09.24 |
---|---|
[Django/Field]null vs blank (0) | 2022.09.20 |
[Django] Django 설치 및 프로젝트 생성 (0) | 2022.09.20 |
[Django|Postgre]postgreSQL설치 및 연동 (0) | 2021.12.06 |
[Django] 프로젝트와 앱 생성하기(+가상환경) ref.DjangoGirls (0) | 2021.11.19 |