본문 바로가기

Django

Foreign key 속성

1. related_name

  • 관계 정의에 사용될 이름

2. db_constraint

  • default=True
  • True가 좋고, False는 데이터 정확성에 좋지 못하다.
  • False를 원하는 상황의 예시는..
    • 유효하지 않는 레거시 데이터를 가지고 있을 때
    • 데이터베이스 샤딩을 할 때
  • False 놓으면, 연관된 다른 존재하지 않는 객체에 접근  DoesNotExist 에러를 발생시킨다.

3. on_delete

  • 외래 키의 대상 테이블의 값이 삭제될 때 어떠한 액션을 취할지 정하는 것.

1) SET_NULL

  • 외래 키의 대상 테이블이 삭제될 때, null=True인 경우, 포린 키를 null로 세팅 가능.

2) SET_DEFAULT

  • 외래 키의 대상 테이블이 삭제될 때, 포린키를 디폴트값으로 놓는다.

3) SET()

  • 외래키의 대상 테이블이 삭제될 때, 포린키를 직접 설정할 수 있다.

4) DO_NOTHING

  • 외래키의 대상 테이블이 삭제될 때, 아무 액션도 취하지 않음
  • 만약에 데이터베이스 필드에 수동으로 on delete 제약 조건을 넣지 않는다면, IntegrityError 발생

5) CASCADE

  • 외래키 대상 테이블 값이 삭제될 시 이 외래 키와 연관된 테이블도 같이 삭제를 한다.

6) PROTECT

  • 연관된 객체 삭제를 막아준다.
  • 즉, 연관된 객체가 존재할 시  ProtectedError를 발생시킴.

7) RESTRICT

  • 연관된 객체의 삭제를 막아준다.
  • protect와 다른 점
    • Cascade 옵션을 가진 연관된 객체가 존재할 시,  restrict가 참조하는 객체와 동일하다면, 그 객체도 함께 삭제를 해준다.

(1) 예시

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})

 

(2) 코드 설명

  • restrict로만 연관된 객체(album)는 따로 삭제가 불가능하다.
  • artist_two 역시 삭제가 안된다.
  • 왜냐하면 song으로 만들어진 artist_two가 존재하지 않기 때문에, artist와 cascade로 연결된 album_two 객체를 삭제할 수 없기 때문이다.
  • 반면에 artist_one은 삭제가 가능하다. artist_one으로 만들어진 song이 존재하므로, 이 song들과 artist_one이 만든 앨범을 같이 삭제 가능하다. 물론 album_two는 artist_two와 cascade로 연결되어 있어서 삭제가 안 된다.

 

 

reference

https://docs.djangoproject.com/ko/4.0/ref/models/fields/

 

 

'Django' 카테고리의 다른 글

model-relation(모델 간 연관관계)  (0) 2022.02.08
Model.Field 옵션  (0) 2022.02.08