[Django] Django 모델 ForeignKeyField on_delete 종류
Back End

[Django] Django 모델 ForeignKeyField on_delete 종류

 

  on_delete 옵션은 Django에서 모델을 구현할 때 데이터베이스 상에서 참조무결성[각주:1]을 유지하여 ForeignKeyField가 바라보는 값이 삭제될 때 해당 요소를 처리하는 방법을 지정해 준다.

  1. CASCADE : ForeignKeyField를 포함하는 모델 인스턴스(row)도 같이 삭제한다.
    1
    2
    3
    4
    5
    from django.db import models
    class TestModel(models.Model):
        pass
    class FKModel(models.Model):
        test = models.ForeignKeyField(TestModel, on_delete=models.CASCADE)
    cs
  2. PROTECT : 해당 요소가 같이 삭제되지 않도록 ProtectedError를 발생시킨다.
    1
    2
    3
    4
    5
    from django.db import models
    class TestModel(models.Model):
        pass
    class FKModel(models.Model):
        test = models.ForeignKeyField(TestModel, on_delete=models.PROTECT)
    cs


  3. SET_NULL : ForeignKeyField 값을 NULL로 바꾼다. null=True일 때만 사용할 수 있다.
    1
    2
    3
    4
    5
    from django.db import models
    class TestModel(models.Model):
        pass
    class FKModel(models.Model):
        test = models.ForeignKeyField(TestModel, on_delete=models.SET_NULL, null=True)
    cs
  4. SET_DEFAULT : ForeignKeyField 값을 default 값으로 변경한다. default 값이 있을 때만 사용할 수 있다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from django.db import models
     
    class TestModel(models.Model):
        pass
     
    DEFAULT_TEST_MODEL_PK = 1
     
    class FKModel(models.Model):
        test = models.ForeignKeyField(TestModel, on_delete=models.SET_DEFAULT, default=DEFAULT_TEST_MODEL_PK)
    cs
  5. SET() : ForeignKeyField 값을 SET에 설정된 함수 등에 의해 설정한다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from django.db import models
     
    class TestModel(models.Model):
        title = models.CharField(max_length=100)
     
    def set_FK_Model_test():
        return TestModel.objects.get(id=1)
     
    class FKModel(models.Model):
        test = models.ForeignKeyField(TestModel, on_delete=models.SET(set_FK_Model_test))
    cs
  6. DO_NOTHING : 아무런 행동을 취하지 않는다. 참조 무결성을 해칠 위험이 있어서 잘 사용되지는 않는다.
    1
    2
    3
    4
    5
    from django.db import models
    class TestModel(models.Model):
        pass
    class FKModel(models.Model):
        test = models.ForeignKeyField(TestModel, on_delete=models.DO_NOTHING)
    cs

 

  1. 관계 데이터베이스 관계 모델에서 2개의 관련 있던 관계 변수 간의 일관성 [본문으로]

'Back End' 카테고리의 다른 글

[Django] Django MTV 개발 방식  (0) 2019.05.16
[Django] Django로 만드는 투표 앱(1) - views.py 설계  (0) 2019.05.08