개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.
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 |
댓글