class Actor(models.Model):
first_name = models.CharField(max_length=45)
last_name = models.CharField(max_length=45)
date_of_birth = models.DateField()
movies = models.ManyToManyField('Movie', through='ActorMovie', related_name='Actor')
class Meta:
db_table = 'actors'
class Movie(models.Model):
title = models.CharField(max_length=45)
release_date = models.DateField()
running_time = models.IntegerField()
class Meta:
db_table = 'movies'
class ActorMovie(models.Model):
actor = models.ForeignKey('Actor', on_delete=models.CASCADE)
movie = models.ForeignKey('Movie', on_delete=models.CASCADE)
class Meta:
db_table = 'actors_movies'
해당 객체가 다른 객체의 Foreign Key를 가지고 있거나 1:1 관계로 있는 상황에서 참조를 하는 경우
ActorMovie 테이블이 Actor 테이블과 Movie 테이블을 정참조하는 것이고
Actor 테이블이 Movie 테이블을 정참조한다.
해당 객체를 참조하고 있는 다른 객체를 참조하려고 하는 경우
다른 객체가 Foreign Key를 가지고 있거나 N:N 관계인 경우
Movie 테이블이 바로 Actor 테이블을 참조하려고 할 때 이를 역참조라고 한다.(through 옵션)
만약 Movie 테이블이 ActorMovie 테이블을 통해 Actor 테이블을 참조한다고 하면,
1) Movie 테이블이 ActorMovie 테이블을 역참조하고
2) ActorMovie 테이블이 Actor 테이블을 정참조한다
이런 순서로 참조를 진행하게 된다.
{참조되는 모델}.{참조하는 모델의 소문자}_set.all()
Actor.movie_set.all()
{참조하는 모델}.{참조되는 모델(FK 있는)의 컬럼}.{역참조 관계명}.all()
Movie.first_name.philmo_name.all()