[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テーブルを定義します.
マクロテーブルはMovieテーブルを参照しています.

2)逆参照


オブジェクトを参照する別のオブジェクトを参照する場合.
他のオブジェクトにはForeign KeyまたはN:N関係があります.
MovieテーブルがActorテーブルを参照しようとしている場合は、逆参照と呼ばれます.(オプションで)
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()