본문 바로가기
기타

TIL - 22.02.17

by DGK 2022. 2. 17.

 

개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.

 

2월 17일(목)

 

Django Foreign Key


Foreign Key on_delete 

 

  • CASCADE
from django.db import models

class Owner(models.Model):
    name  = models.CharField(max_length=45)
    email = models.CharField(max_length=300)
    age   = models.IntegerField()
    
    class Meta:
        db_table = 'owners'
    

class Dog(models.Model):
    owner = models.ForeignKey('Owner', on_delete=models.CASCADE)
    name  = models.CharField(max_length=45)
    age   = models.IntegerField()
    
    class Meta:
        db_table = 'dogs'

 

ForeignKeyField가 정참조하고 있는 table의 데이터(row)가 삭제될 때, ForeignKeyField에 매칭되는 모델 인스턴스(row)도 삭제된다.

 

 

  • PROTECT
from django.db import models

class Owner(models.Model):
    name  = models.CharField(max_length=45)
    email = models.CharField(max_length=300)
    age   = models.IntegerField()
    
    class Meta:
        db_table = 'owners'
    

class Dog(models.Model):
    owner = models.ForeignKey('Owner', on_delete=models.PROTECT)
    name  = models.CharField(max_length=45)
    age   = models.IntegerField()
    
    class Meta:
        db_table = 'dogs'

 

ForeignKeyField가 정참조하고 있는 table의 데이터(row)가 삭제될 때, ForeignKeyField에 매칭되는 모델 인스턴스(row)가 삭제되지 않도록 ProtectedError를 반환한다.

 

 

  • SET_NULL
from django.db import models

class Owner(models.Model):
    name  = models.CharField(max_length=45)
    email = models.CharField(max_length=300)
    age   = models.IntegerField()
    
    class Meta:
        db_table = 'owners'
    

class Dog(models.Model):
    owner = models.ForeignKey('Owner', on_delete=models.SET_NULL, null=True)
    name  = models.CharField(max_length=45)
    age   = models.IntegerField()
    
    class Meta:
        db_table = 'dogs'

 

 

ForeignKeyField가 정참조하고 있는 table의 데이터(row)가 삭제될 때, ForeignKeyField 값을 null 값으로 바꿔준다. (단, null=True 속성 필요)

 

 

  • SET_DEFAULT
from django.db import models

class Owner(models.Model):
    name  = models.CharField(max_length=45)
    email = models.CharField(max_length=300)
    age   = models.IntegerField()
    
    class Meta:
        db_table = 'owners'
    

DEFAULT_TEST_MODEL_PK = 1


class Dog(models.Model):
    owner = models.ForeignKey('Owner', on_delete=models.SET_DEFAULT, default=DEFAULT_TEST_MODEL_PK)
    name  = models.CharField(max_length=45)
    age   = models.IntegerField()
    
    class Meta:
        db_table = 'dogs'

 

ForeignKeyField가 정참조하고 있는 table의 데이터(row)가 삭제될 때, ForeignKeyField 값을 default 값으로 바꿔준다. (단, default 값이 존재할 때에만 가능)

 

 

  • SET()
from django.db import models

class Owner(models.Model):
    name  = models.CharField(max_length=45)
    email = models.CharField(max_length=300)
    age   = models.IntegerField()
    
    class Meta:
        db_table = 'owners'
    

def set_FK_Model_test():
    return TestModel.objects.get(id=1)


class Dog(models.Model):
    owner = models.ForeignKey('Owner', on_delete=models.SET(set_FK_Model_test))
    name  = models.CharField(max_length=45)
    age   = models.IntegerField()
    
    class Meta:
        db_table = 'dogs'

 

ForeignKeyField가 정참조하고 있는 table의 데이터(row)가 삭제될 때, ForeignKeyField 값은 SET() 함수에 설정된 값으로 대체된다.

 

 

  • DO_NOTHING
from django.db import models

class Owner(models.Model):
    name  = models.CharField(max_length=45)
    email = models.CharField(max_length=300)
    age   = models.IntegerField()
    
    class Meta:
        db_table = 'owners'
 

class Dog(models.Model):
    owner = models.ForeignKey('Owner', on_delete=models.DO_NOTHING)
    name  = models.CharField(max_length=45)
    age   = models.IntegerField()
    
    class Meta:
        db_table = 'dogs'

 

ForeignKeyField가 정참조하고 있는 table의 데이터(row)가 삭제될 때, 어떠한 일도 발생하지 않는다.

(단, 해당 속성을 사용하면 데이터베이스의 참조 무결성을 훼손할 위험이 존재함)

 

 

'기타' 카테고리의 다른 글

TIL - 22.02.21  (0) 2022.02.21
TIL - 22.02.18  (0) 2022.02.18
TIL - 22.02.16  (0) 2022.02.16
TIL - 22.02.15  (0) 2022.02.16
TIL - 22.02.14  (0) 2022.02.14

댓글