多対多の関係
多対多の関係を定義するには、 ManyToManyField を使用します。
この例では、Article
は複数のPublication
オブジェクトで公開でき、Publication
には複数のArticle
オブジェクトがあります。
以下は、PythonAPI機能を使用して実行できる操作の例です。
いくつかのPublications
を作成します。
Article
を作成します:
保存されるまで、Publication
に関連付けることはできません。
それを保存!
Article
をPublication
に関連付けます。
別のArticle
を作成し、Publications
に表示されるように設定します。
もう一度追加しても問題ありません。関係は重複しません。
間違ったタイプのオブジェクトを追加すると、TypeError
が発生します。
create()を使用して、Publication
を作成してArticle
に1ステップで追加します。
Article
オブジェクトは、関連するPublication
オブジェクトにアクセスできます。
Publication
オブジェクトは、関連するArticle
オブジェクトにアクセスできます。
多対多の関係は、関係全体のルックアップを使用して照会できます。
count()関数は、 distinct()も尊重します。
逆m2mクエリがサポートされています(つまり、 ManyToManyField がないテーブルから開始します)。
関連するアイテムを除外しても、期待どおりに機能します(ただし、関連するSQLは少し複雑です)。
Publication
を削除すると、そのArticles
はそれにアクセスできなくなります。
Article
を削除すると、そのPublications
はそれにアクセスできなくなります。
m2mの「もう一方の」端を介して追加します。
キーワードを使用してもう一方の端から追加する:
Article
からPublication
を削除する:
そしてもう一方の端から:
リレーションセットを設定できます。
リレーションセットはクリアできます:
そして、あなたはもう一方の端からクリアすることができます:
削除したArticle
とPublication
を再作成します。
一部のPublications
を一括削除します-削除されたパブリケーションへの参照は次のようになります。
一部の記事を一括削除します-削除されたオブジェクトへの参照は次のようになります。
delete()の後、 QuerySet キャッシュをクリアする必要があり、参照されているオブジェクトを削除する必要があります。