[Django] 정참조, 역참조

1. 정참조, 역참조

models.py

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'

1)정참조

해당 객체가 다른 객체의 Foreign Key를 가지고 있거나 1:1 관계로 있는 상황에서 참조를 하는 경우

ActorMovie 테이블이 Actor 테이블과 Movie 테이블을 정참조하는 것이고
Actor 테이블이 Movie 테이블을 정참조한다.

2) 역참조

해당 객체를 참조하고 있는 다른 객체를 참조하려고 하는 경우
다른 객체가 Foreign Key를 가지고 있거나 N:N 관계인 경우

Movie 테이블이 바로 Actor 테이블을 참조하려고 할 때 이를 역참조라고 한다.(through 옵션)
만약 Movie 테이블이 ActorMovie 테이블을 통해 Actor 테이블을 참조한다고 하면,
1) Movie 테이블이 ActorMovie 테이블을 역참조하고
2) ActorMovie 테이블이 Actor 테이블을 정참조한다
이런 순서로 참조를 진행하게 된다.

2. 역참조 사용 방법

1) _set manager 사용

{참조되는 모델}.{참조하는 모델의 소문자}_set.all()

Actor.movie_set.all()

2) related_name 사용

{참조하는 모델}.{참조되는 모델(FK 있는)의 컬럼}.{역참조 관계명}.all()

Movie.first_name.philmo_name.all()

좋은 웹페이지 즐겨찾기