デフォルト中間テーブル
まず、モデルはこれです:
クラスの人(models.Model):
名前 = models.CharField(MAX_LENGTH = 128 )
デフ __str__ (自己):
戻りself.nameの
クラスグループ(models.Model):
名前 = models.CharField(MAX_LENGTH = 128 )
のメンバー = モデル。 ManyToManyField(人)
デフ __str__ (自己):
戻り self.name
会員によるグループモデルで多対多の道へのフィールドは人モデルとの関係を確立します。
データベース内の実際のコンテンツを見るために、Djangoはアプリケーション名APP1である、3つのデータテーブルを作成します。
その後、データベースで次のPersonオブジェクトを追加します。
グループは、次のオブジェクトを追加します。
テーブルの真ん中を見てみましょう、それは次のようになります。
まず、Djangoは追加デフォルトでidが、そこにあります。そして、デフォルトであるidカラム人グループでは、Djangoは道の二つのテーブルに関連付けられています。関連する列を設定するには、to_fieldパラメータを使用することができます。
テーブルの中央に見え、しない2つのデータテーブルは、一緒に格納されているが、関連したIDをマッピングしています。
第二に、カスタム中間テーブル
一般的に、通常の-多くは、独自の第三リレーショナル表を作成することなく、十分なされています。しかし、場合によってはそれ以上のそのような行うグループに参加する人の時間を節約したいと、複雑になりますか?あなたがグループにそれを保存したい理由は?
Djangoが提供するthrough
時間の同様のセットに、中間モデルを指定するパラメータを、他のフィールドを招待するための理由は、モデルの中央に配置することができます。例としては、次のとおりです:
django.db 輸入モデル
クラス:人(models.Model)
名 = models.CharField(MAX_LENGTH = 128 )
デフ __str__ (自己):
戻りself.nameの
クラスグループ(models.Model):
名前 = models.CharField(max_lengthを= 128 )
のメンバー = models.ManyToManyField =から(人、' 会員' )
デフ __str__ (自己):
戻りself.nameの
クラスメンバーシップ(models.Model):
人 = models.ForeignKey(人、on_delete =models.CASCADE)
群 = models.ForeignKey(グループ、on_delete = models.CASCADE)
date_joined = models.DateField() #进组时间
invite_reason = models.CharField(MAX_LENGTH = 64) #邀请原因
テーブルの中央に、少なくとも2つの外部キーフィールド、二つのモデルに関連する各点を書き込みます。本実施形態では、それは「人」と「グループ」です。ここでは、我々はさらに、「date_joined」フィールドを増加させたグループにスタッフのための時間を節約し、「invite_reason」フィールドはグループへの招待の理由を保持しています。
それでも、データベース内の実際の見た目以下:
テーブル名のメモ真ん中は「app2_membership」となっています。
人とグループ変わりません。
しかし、テーブルの真ん中別の話!完全に私たちが必要なものを保存されています。
第三に、中間テーブル
上記の表の真ん中、以下は若干の使用例を示します。
>>>リンゴ= Person.objects.create(名前= " リンゴ・スター" )
>>>ポール= Person.objects.create(名= " ポール・マッカートニー" )
>>>ビートルズ= Group.objects.create(名前= " ビートルズ" )
>>> M1 =会員(人=林檎、グループ= ビートルズ、
... date_joined =日付(1962、8、16 )、
... invite_reason = " 新しいドラマーが必要でした。" )
>>> M1 .SAVE()
>>> beatles.members.all()
<クエリセット[<者:リンゴスター>]>
>>>ringo.group_set.all()
<クエリセット[<グループ:ビートルズ>]>
>>>平方メートル= Membership.objects.create(人=ポール、グループ= ビートルズ、
... date_joined =日付(1960、8、1 )、
... invite_reason = " バンドを形成したかった。」)
>>> beatles.members.all()
<クエリセット[<者:リンゴスター>、<者:ポール・マッカートニー>]>
追加()、()のremove()、およびセット()メソッドを作成を使用して作成することはできませんテーブルのカスタム多くの真ん中を使用するのと同じ通常の-多くはない、削除の関係は、以下を参照してください。
>>> #无效
>>> beatles.members.add(ジョン)
>>> #无效
>>> beatles.members.create(名= " ジョージ・ハリスン" )
>>> #无效
>>> beatles.members.set ([ジョン、ポール、リンゴ、ジョージ])
なぜ?上記の方法で参加する時間を提供することができないので、理由フィールドの内容やその他の中間モデルのニーズを招待。唯一の方法は、中間体モデルのこのタイプのインスタンスを作成することにより、多くの関連付けを作成することです。しかし、clear()メソッドは、それがすべての多くの関係をクリアすることができ、効果的です。
>>> beatles.members.clear()
>>> #中間オブジェクト・モデルを削除
>>> Membership.objects.all()
<クエリセットその[]>
あなたは中間モデルを作成するプロセスによって関連-多くのインスタンスを確立したら、それはすぐに多対として、通常のクエリのように動作させることができます。
#検索すべてのグループは、グループ内の(名前ポールの冒頭に)この人ポールを持って
>>> Group.objects.filter(members__name__startswith = 「ポール」)
<クエリセット[<グループ:ビートルズで>]>
あなたは、中間モデルクエリのプロパティを使用することができます。
>>> Person.objects.filter(
... group__name = ' ビートルズ' 、
... membership__date_joined__gt =日付(1961,1,1 ))
<クエリセット[<パーソン:リンゴ・スター]>
あなたは、共通の中間モデルと同じモデルを使用することができます。
>>> ringos_membership = Membership.objects.get(グループ=ビートルズ、人= リンゴ)
>>> ringos_membership.date_joined
datetime.date( 1962、8、16 )
>>> ringos_membership.invite_reason
「新しいドラマーを必要としていました。'
>>> ringos_membership = ringo.membership_set.get(グループ= ビートルズ)
>>> ringos_membership.date_joined
datetime.date( 1962、8、16 )
>>> ringos_membership.invite_reason
' 新しいドラマーを必要としました。"
この部分は、モデルのクエリの背中の組み合わせを必要とします。
テーブルの中央のために、それはもはや、デフォルトで、グループの人と外部キー関係のそれぞれに、すなわちのみ会員にソースモデルへの外部キー関係、上記の例を含むだけ中間モデルを指摘していないしなければなりません。それ以外の場合は、明示的でなければならないManyToManyField.through_fields
パラメータを指定されたオブジェクトに関連付けられています。以下の例を参照:
django.db 輸入モデル
クラス:人(models.Model)
名 = models.CharField(max_lengthを= 50 )
クラスグループ(models.Model):
名前 = models.CharField(MAX_LENGTH = 128 )
のメンバー = models.ManyToManyField(
人、
通じ = ' 会員' 、
through_fields =(' グループ'、' 人' )、
)
クラスメンバーシップ(models.Model):
グループ= models.ForeignKey(グループ、on_delete = models.CASCADE)
人 = models.ForeignKey(人、on_delete = models.CASCADE)
招待 = models.ForeignKey(
人、
on_delete = models.CASCADE、
related_name = " membership_invites " 、
)
invite_reason = models.CharField(MAX_LENGTH = 64)