Django ManyToMany
モデル間のデータが多対多の関係である場合、ManyToManyを使用します.
スターバックス飲料とアレルギー関係
1つの飲料には、アレルギーを誘発する成分が複数存在し、1つのアレルギーを誘発する成分が複数の飲料に存在する可能性がある.この場合はManyToManyが使用されます
外部キー(foreignKey)を使用してテーブル構造を作成できます.
2つのモデルの1つにManyToManyを使用します.
作成する必要がなく、中間テーブルが自動的に作成されます.
中間テーブルの名前はproduct allensisという2つのテーブルです.
最大の違いは、クエリー文を使用してテーブルにアクセスする方法です.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을 붙인다.
Reference
この問題について(Django ManyToMany), 我々は、より多くの情報をここで見つけました https://velog.io/@tonic523/Django-ManyToManyテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol