Django 모델에서 On_delete 매개 변수의 기능
Django 모델은 데이터베이스 및 테이블 생성, 테이블에 새 데이터 또는 튜플 추가, 삭제, 검색 및 수정을 단순화합니다. Django 모델을 사용하면 외래 키를 사용하여 테이블 간의 관계를 쉽게 설정할 수 있습니다.
관계를 설정할 때 몇 가지 매개 변수에 대한 값을 설정해야합니다. 이러한 매개 변수 중 하나는on_delete
입니다. on_delete
매개 변수는 참조 된 객체가 삭제 될 때 채택되어야하는 동작을 구성하는 데 사용됩니다. 기본적으로 참조 된 개체의 삭제 효과를 처리하는 방법을 정의하는 데 사용됩니다.
on_delete
매개 변수를 구성 할 수있는 7 가지 가능한 동작 또는 조치가 있습니다. 우리는 그들 모두에 대해 개별적으로 이야기 할 것입니다.
CASCADE
인수
계단식 동작은 일반적으로 모델 간의 관계를 설정할 때 사용됩니다. 참조 된 개체가 삭제되면 해당 참조 된 개체를 참조하는 모든 개체도 삭제됩니다.
통사론
XYZ = models.ForeignKey(WASD, on_delete=models.CASCADE)
좀 더 잘 이해하려면 다음 예를 고려하십시오. 다른 동작도 설명하는 데 동일한 예제가 사용됩니다.
저자가 자신을 등록하고 웹 사이트에 블로그를 작성할 수있는 웹 사이트가 있습니다. 이제 두 엔티티를 나타내며Author
및Blog
라는 두 모델을 고려합니다. Blog
의 모든 항목 또는 튜플에는Author
항목 또는 튜플에 대한 외래 키 참조 (또는 참조)가 있습니다. 그것은 모든 블로그가 작성되는 관계를 나타냅니다.
이제 웹 사이트에 작성자가 자신의 계정을 삭제하면 작성자가 작성한 모든 블로그가 삭제된다는 정책이 있다고 가정 해 보겠습니다. 이러한 시나리오에서는 계단식 관계가 적절한 선택이 될 것입니다.
PROTECT
인수
PROTECT
인수는이 개체를 참조하는 개체가있는 경우 참조 된 개체의 삭제를 방지합니다. 즉, 참조하는 객체가 존재하는 한 참조 된 객체를 삭제할 수 없습니다. 참조 객체를 삭제하기 전에 참조 객체를 수동으로 삭제해야합니다. 삭제는ProtectedError
를 발생시켜 방지됩니다.
이 관계는 데이터가 매우 중요하고 민감한 장소에서 사용할 수 있으며 적절한 처리로 데이터를 잃어 버릴 여유가 없습니다. 또는 참조하는 객체가 다른 곳에서도 사용되고 있으며 적절한 유효성 검사 및 처리 없이는 삭제할 수 없습니다.
RESTRICT
인수
RESTRICT
는PROTECT
와 유사합니다. 또한 참조 된 객체의 삭제를 방지하고RestrictedError
를 발생시킵니다. 그러나 둘 사이에는 약간의 차이가 있습니다. ‘PROTECT’와 달리 참조 된 객체가 다른 객체를 참조하고있는 것은 ‘CASCADE’관계이고 또한 삭제되는 경우 삭제가 허용됩니다. 즉, 참조하는 개체와 참조 된 개체가 ‘CASCADE’관계에서 다른 공통 개체를 참조하는 경우 참조 된 개체의 삭제가 허용됩니다.
다음 예를 고려하십시오.
class Artist(models.Model):
name = models.CharField(max_length=100)
class Album(models.Model):
artist = models.ForeignKey(Artist, on_delete=models.CASCADE)
class Song(models.Model):
artist = models.ForeignKey(Artist, on_delete=models.CASCADE)
album = models.ForeignKey(Album, on_delete=models.RESTRICT)
Album
개체를 삭제하려고하면RestrictedError
가 발생합니다. 그러나Artist
개체를 삭제하려고하면Album
개체를 참조하는 노래가 CASCADE relationship
의Album
개체가 참조하는Artist
개체도 참조하고 있으므로 삭제가 성공합니다.
SET_NULL
인수
SET_NULL
의 경우 이름에서 알 수 있듯이 참조 된 개체가 삭제되면 모든 참조 개체에 대한 참조 된 개체가NULL
로 설정됩니다. 이 관계를 사용하려면 참조 된 개체 필드가 null을 허용해야합니다.
XYZ = models.ForeignKey(WASD, on_delete=models.SET_NULL, null=True)
예를 들어 웹 사이트에 작성자가 떠나면 블로그가 삭제되지 않고 삭제된다는 정책이있는 경우. 대신 모든 블로그의 작성자가 익명 작성자 또는None
으로 설정됩니다.
SET_DEFAULT
인수
SET_DEFAULT
의 경우 참조 된 개체가 삭제되면 모든 참조 개체에 대한 참조 된 개체가 기본값으로 설정됩니다. 이 기본값은 다른 Django 모델이나 테이블뿐만 아니라NULL
일 수 있습니다. 이 관계에서는NULL
의 경우 참조 된 오브젝트 필드가 널 입력 가능해야합니다.
XYZ = models.ForeignKey(WASD, on_delete=models.SET_DEFAULT, null=True, default=QWERTY)
예를 들어 웹 사이트에 작성자가 떠나면 모든 블로그의 작성자가 관리자 또는 회사 자체가된다는 정책이있는 경우. 이러한 경우SET_DEFAULT
가 올바른 선택입니다.
SET()
인수
SET()
은SET_DEFAULT
와 정확히 동일합니다. Django 모델이나 테이블도 받아 들일 수 있습니다. 유일한 차이점은SET()
에서 참조 된 객체가 삭제되면 모든 참조 객체에 대해 호출되는 콜 러블을 전달할 수 있다는 것입니다.
XYZ = models.ForeignKey(WASD, on_delete=models.SET(...), null=True)
모델과 함께 호출 가능한 함수는 다음과 같습니다.
def getUser():
"""Callable function"""
return User.objects.get_or_create(username="anonymous")[0]
class Author(models.Model):
user = models.ForeignKey(User, on_delete=models.SET(getUser))
DO_NOTHING
인수
DO_NOTHING
은 두 모델간에 존재할 수있는 약간 위험한 관계입니다. 이름에서 알 수 있듯이 참조 된 개체가 삭제되면 참조 된 개체는 모든 참조 개체에 대해 변경되지 않습니다. 즉, 삭제 효과를 처리하기 위해 아무것도 수행되지 않습니다.
이는 참조 된 개체가 삭제되었지만 참조하는 개체가 계속 참조하고 있기 때문에 무결성 문제를 일으킬 수 있으므로 매우 위험한 동작입니다.
XYZ = models.ForeignKey(WASD, on_delete=models.DO_NOTHING)