TIL-030|Django Many to Many Fieldの使用


📝 前のデータベース・ロケーションで説明したように、Many to Many(N:N)関係には、2つのテーブルを接続し、関係を表す中間テーブルが必要です.djangoもモデル実装時に中間テーブルを作成する必要があります.中間テーブルを直接作成する方法とMantoManyFiledを使用する方法があります.

Many to Many field

  • model.pyで中間テーブルを作成するクラスではなく、djangoで直接中間テーブルを作成する機能です.
  • Queryメソッドを使用して、中間テーブルをデータ制御できます.
  • #직접 중간테이블을 생성한 model
    
    class Actor(models.Model):
        first_name = models.CharField(max_length=45)
        last_name = models.CharField(max_length=45)
        date_of_birth = models.DateField()
    
        class Meta:
            db_table = 'actors'
    
    class Movie(models.Model):
        title = models.CharField(max_length=45)
        release_date = models.DateField()
        running_time = models.IntegerField(default=0)
    
        class Meta:
            db_table = 'movies'
    
    class Actor_movie(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を使用して、中間テーブルのモデルを直接作成します.
    👉 actors moviesテーブルにデータを直接挿入して接続する必要があります.
    👉 データにアクセスする場合は、中間テーブルを逆参照し、接続テーブルを介して値を取得する必要があります.これは不便です.
    #manytomanyfield를 사용한 model
    
    class Actor(models.Model):
        first_name = models.CharField(max_length=45)
        last_name = models.CharField(max_length=45)
        date_of_birth = models.DateField()
        
        class Meta:
            db_table = 'actors'
    
    class Movie(models.Model):
        title = models.CharField(max_length=45)
        release_date = models.DateField()
        running_time = models.IntegerField(default=0)
        actor = models.ManyToManyField(Actor, related_name='movies')
    
        class Meta:
            db_table = 'movies'
    👉 ManyToManyFieldを使用してMany to Manyモデルのモデルを実装する.pyのコードです.
    👉 relate_nameを使用する場合は、逆参照時に使用する_setを使用する必要はありません.
    👉 ワイルドカードを使用して、中間テーブルを制御できます.
    👉 自動生成された中間テーブルにデータを挿入することは、以下のadd()によって行うことができる.
    # $ python manage.py shell
    >>> a1 = Actor.objects.get(id=1)
    >>> m2 = Movie.objects.get(id=1)
    >>> m1.actor.add(a1)
    
    >>> a2 = Actor.objects.get(id=2)
    >>> m2 = Movie.objects.get(id=2)
    >>> m2.actor.add(a2)
    最後にManyToManyFieldを使うメリットをまとめます.
    1)中間テーブルを別途作成する必要はなく、Djangoで自動的に作成することもできます.
    2) Views.pyでクラスビューを実装する場合は、中間テーブルを通過する必要がないため、コードが短く、直感的で、読みやすさが向上します.
    3)Query法を用いたCRUDの方が簡便である.