Django でのデータベース操作メソッド ManyToManyField() の使用法を実際の例を通して説明します [データ テーブルの「多対多」関係]

多対多の関係のためのデータベース設計に関しては、Django はManyToManyField()2 つのモデル間の多対多の関連付けを可能にするフィールドを提供します。実際の例でその使用法を説明しましょう。

Author(作成者) と(投稿)の 2 つのモデルを備えた単純なブログ アプリケーションを構築しているとしますPost1 人の投稿者が複数の投稿を作成でき、1 つの投稿に複数の投稿者が含まれる場合があります。これは典型的な多対多の関係です。

ManyToManyField()まず、これら 2 つのモデルを定義し、それらの間に多対多の関係を確立する必要があります。サンプルコードは次のとおりです。

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    posts = models.ManyToManyField('Post')

    def __str__(self):
        return self.name

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

    def __str__(self):
        return self.title

上記のコードでは、Authorモデルに と呼ばれるフィールドが含まれており、これはpostsモデルManyToManyField()との多対多の関係を確立するために使用されますPostまた、PostモデルはAuthorモデルを直接参照するのではなく、AuthorモデルのManyToManyField()フィールドを通じて関連付けを確立します。

これで、これら 2 つのモデルのテーブルをデータベースに作成できるようになりました。Django の移行コマンドを実行して、モデルをデータベースに同期します。

python manage.py makemigrations
python manage.py migrate

ManyToManyField()これで、多対多の関連付けにフィールドを使用できるようになりました。一般的な例をいくつか示します。

多対多の関連付けを作成します。

author1 = Author.objects.create(name='John')
author2 = Author.objects.create(name='Jane')

post1 = Post.objects.create(title='Post 1', content='Content 1')
post2 = Post.objects.create(title='Post 2', content='Content 2')

# 添加多对多关联
post1.authors.add(author1)
post1.authors.add(author2)

post2.authors.add(author1)

上の例では、2 人の作成者 (ジョンとジェーン) と 2 つの投稿 (投稿 1 と投稿 2) を作成し、add()メソッドを使用してそれらを関連付けました。add()メソッドは、ManyToManyField()関連付けられたオブジェクトをフィールドに追加するために使用されます。

多対多の関連付けをクエリします。

# 获取帖子的作者列表
post = Post.objects.get(title='Post 1')
authors = post.authors.all()

# 获取作者的帖子列表
author = Author.objects.get(name='John')
posts = author.posts.all()

上の例では、all()メソッドを使用して、特定の投稿または作成者に関連付けられたすべてのオブジェクトのリストを取得しました。

多対多の関連付けを削除します。

# 移除帖子的作者关联
post = Post.objects.get(title='Post 1')
post.authors.remove(author1)

# 清除作者的帖子关联
author = Author.objects.get(name='John')
author.posts.clear()
``

おすすめ

転載: blog.csdn.net/wenhao_ir/article/details/131552739