Django ManyToMany


モデル間のデータが多対多の関係である場合、ManyToManyを使用します.


スターバックス飲料とアレルギー関係

1つの飲料には、アレルギーを誘発する成分が複数存在し、1つのアレルギーを誘発する成分が複数の飲料に存在する可能性がある.この場合はManyToManyが使用されます

中間表を直接作成


外部キー(foreignKey)を使用してテーブル構造を作成できます.
from django.db import models

class Product(models.Model):
    name = models.CharField(max_length = 45)
    
    class Meta:
        db_table = "products"

class Allergy(models.Model):
    name = models.CharField(max_length = 45)
    
    class Meta:
        db_table = "allergies"

class ProductAllergy(models.Model):
    product = models.ForeignKey(Product, on_delete = models.CASCADE)
    allergy = models.ForeignKey(Allergy, on_delete = models.CASCADE)
    
    class Meta:
        db_table = "products_allergies"
中間テーブルProductAllenergyを直接作成し、外部キーを使用して2つのテーブルに接続します.

ManyToManyFiledの作成


2つのモデルの1つにManyToManyを使用します.
from django.db import models

class Product(models.Model):
    name = models.CharField(max_length = 45)
    allergy = models.ManyToManyField(Allergy, through = 'ProductAllergy')
    
    class Meta:
        db_table = "products"
    
class Allergy(models.Model):
    name = models.CharField(max_length = 45)
    
    class Meta:
        db_table = "allergies"

class ProductAllergy(models.Model):
    product = models.ForeignKey("Product", on_delete = models.CASCADE)
    allergy = models.ForeignKey("Allergy", on_delete = models.CASCADE)
    
    class Meta:
        db_table = "products_allergies"
上にはthroughで真ん中のテーブルが作られていましたが
作成する必要がなく、中間テーブルが自動的に作成されます.
中間テーブルの名前はproduct allensisという2つのテーブルです.

この二つの違いは何ですか。


最大の違いは、クエリー文を使用してテーブルにアクセスする方法です.ManyToManyでは、中間テーブルにアクセスせずにデータを内部にインポートできます.
カフェラテアレルギーを知りたい時
cafelatte = Product.objects.get(name='카페라떼')
cafelatte.allergy.all()
牛乳アレルギーの飲み物を知りたい時
milk = Allergy.objects.get(name = '우유')
milk.product_set.all() # 역참조일 때는 set을 붙인다.