Django 모델에서 On_delete 매개 변수의 기능

Vaibhav Vaibhav 2023년1월30일
  1. CASCADE 인수
  2. PROTECT 인수
  3. RESTRICT 인수
  4. SET_NULL 인수
  5. SET_DEFAULT 인수
  6. SET()인수
  7. DO_NOTHING 인수
Django 모델에서 On_delete 매개 변수의 기능

Django 모델은 데이터베이스 및 테이블 생성, 테이블에 새 데이터 또는 튜플 추가, 삭제, 검색 및 수정을 단순화합니다. Django 모델을 사용하면 외래 키를 사용하여 테이블 간의 관계를 쉽게 설정할 수 있습니다.

관계를 설정할 때 몇 가지 매개 변수에 대한 값을 설정해야합니다. 이러한 매개 변수 중 하나는on_delete입니다. on_delete매개 변수는 참조 된 객체가 삭제 될 때 채택되어야하는 동작을 구성하는 데 사용됩니다. 기본적으로 참조 된 개체의 삭제 효과를 처리하는 방법을 정의하는 데 사용됩니다.

on_delete매개 변수를 구성 할 수있는 7 가지 가능한 동작 또는 조치가 있습니다. 우리는 그들 모두에 대해 개별적으로 이야기 할 것입니다.

CASCADE 인수

계단식 동작은 일반적으로 모델 간의 관계를 설정할 때 사용됩니다. 참조 된 개체가 삭제되면 해당 참조 된 개체를 참조하는 모든 개체도 삭제됩니다.

통사론

XYZ = models.ForeignKey(WASD, on_delete=models.CASCADE)

좀 더 잘 이해하려면 다음 예를 고려하십시오. 다른 동작도 설명하는 데 동일한 예제가 사용됩니다.

저자가 자신을 등록하고 웹 사이트에 블로그를 작성할 수있는 웹 사이트가 있습니다. 이제 두 엔티티를 나타내며AuthorBlog라는 두 모델을 고려합니다. Blog의 모든 항목 또는 튜플에는Author항목 또는 튜플에 대한 외래 키 참조 (또는 참조)가 있습니다. 그것은 모든 블로그가 작성되는 관계를 나타냅니다.

이제 웹 사이트에 작성자가 자신의 계정을 삭제하면 작성자가 작성한 모든 블로그가 삭제된다는 정책이 있다고 가정 해 보겠습니다. 이러한 시나리오에서는 계단식 관계가 적절한 선택이 될 것입니다.

PROTECT 인수

PROTECT인수는이 개체를 참조하는 개체가있는 경우 참조 된 개체의 삭제를 방지합니다. 즉, 참조하는 객체가 존재하는 한 참조 된 객체를 삭제할 수 없습니다. 참조 객체를 삭제하기 전에 참조 객체를 수동으로 삭제해야합니다. 삭제는ProtectedError를 발생시켜 방지됩니다.

이 관계는 데이터가 매우 중요하고 민감한 장소에서 사용할 수 있으며 적절한 처리로 데이터를 잃어 버릴 여유가 없습니다. 또는 참조하는 객체가 다른 곳에서도 사용되고 있으며 적절한 유효성 검사 및 처리 없이는 삭제할 수 없습니다.

RESTRICT 인수

RESTRICTPROTECT와 유사합니다. 또한 참조 된 객체의 삭제를 방지하고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 relationshipAlbum개체가 참조하는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)
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

관련 문장 - Django Model