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 |