TIL #85 : [Django] on_delete=RESTRICT

셀레스틴 허·2021년 3월 5일
post-thumbnail

2차 프로젝트 팀원들과 함께 on_delete을 고민하며 값을 입력하던 중 발견한 on_delete=RESTRICT.. 이 친구는 PROTECT와 어떻게 다른가? Django 3.1버전부터 등장한 친구라 정보 조차 귀하다..

RESTRICT

on_delete 관계 :

Artist - Album | CASCADE
Album - Song | RESTRICT
Artist - Song | CASCADE

class Artist(models.Model):
    name = models.CharField(max_length=10)

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)
>>> artist_one = Artist.objects.create(name='artist one')
>>> artist_two = Artist.objects.create(name='artist two')
>>> album_one = Album.objects.create(artist=artist_one)
>>> album_two = Album.objects.create(artist=artist_two)
>>> song_one = Song.objects.create(artist=artist_one, album=album_one)
>>> song_two = Song.objects.create(artist=artist_one, album=album_two)
>>> album_one.delete()
# Raises RestrictedError.
>>> artist_two.delete()
# Raises RestrictedError.
>>> artist_one.delete()
(4, {'Song': 2, 'Album': 1, 'Artist': 1})

album_one.delete()

album_one과 song_one은 restrict 관계이며, song_one은 album_one을 참조하기 때문에 delete이 안된다.

artist_two.delete()

artist_two를 삭제하고 싶어도, album_two를 참조하는 테이블 song_two(artist_one이 만든)가 있어 테이블을 삭제할 수도 값을 변경할 수도 없다.

song_two ➔ artist_two: 너는 내 부모가 아니잖아. RestrictedError!
Song.album의 restricted FK 때문에 삭제가 제한된다.

artist_one.delete()

artist_one과 song_one, song_two는 cascade 관계이기 때문에 artist_one, album_one, song_one, song_two 모두 삭제된다.

artist_one(왕부모)을 참조하는 모든 자식들이 다 같이 없어진다.

delete 안 된 데이터

그렇게 남는 데이터는 | artist_two, album_two 이렇게 두개다.

song_one ➔ artist_one: 너가 내 부모구나! 오케이 delete을 허락하지!
song_two ➔ artist_two: 너가 내 부모구나! 오케이 delete을 허락하지!

개인적인 생각 :

데이터베이스의 모든 관계를 다 파악했을 때 restrict를 쓰자. 그것도 정말 중요한 곳에만!

PROTECT : 아무것도 가져갈 수 없어!
RESTRICT : 진짜 다 가져가도 얘는 안돼!

Reference:
https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.on_delete
https://ychae-leah.tistory.com/142

profile
Software Developer / 고통은 필연, 괴로움은 선택

0개의 댓글