djangomysql操作多对多的两种方式

本文详细解析了Django ORM中多对多关系的两种实现方式,包括自动生成第三张关联表的方法和通过指定中间表的方式,阐述了如何进行数据的添加和查询操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.(第一种多对多方式,自动生成第三张关联表)创建三张表,出版社/作者/图书表

出版社和图书 是一对多

作者和图书 是多对多

模型:

# 出版社
class Publisher(models.Model):
    name = models.CharField(max_length=20)
    address = models.CharField(max_length=20)

# 作者
class Author(models.Model):
    title = models.CharField(max_length=20)
    email = models.CharField(max_length=20)

class Book(models.Model):
    name = models.CharField(max_length=20)
    authors = models.ManyToManyField(Author,related_name='book')
    publilsher = models.ForeignKey(Publisher)

多对多使用ManyToManyField,会自动另外生成一张关系表,通过related_name来设置反向查询

 

创建图书,多对多通过.add添加数据到自动生成的关系表。

def save():
    publisher = Publisher.objects.create(name='海淀出版社',address='五道口')
    author1 = Author.objects.create(title='老王',email='laowang@qq.com')
    book = Book.objects.create(name='语文',publilsher=publisher)
    book.authors.add(author1)

查询

def search():
    # 普通查询
    # print(Author.objects.all())
    # print(Author.objects.get(title='老王'))
    # print(Author.objects.count())
    # 过滤查询
    # print(Author.objects.filter(title='老李'))
    # print(Author.objects.filter(id__gt=0))
    # print(Publisher.objects.filter(id__exact=3))
    # print(Publisher.objects.get(id=3))
    # 关联查询  一查询多
    # p = Publisher.objects.get(id=5)
    # print(p.book_set.all())
    # 关联查询 多查询一
    # print(Book.objects.get(id=2).publilsher)
    # 多对多关联查询
    print(Book.objects.get(id=2).authors.all())
    print(Author.objects.get(id=3).book.all())

二.多对多第二种创建方式through

# 出版社
class Publisher2(models.Model):
    name = models.CharField(max_length=20)
    address = models.CharField(max_length=20)

# 作者
class Author2(models.Model):
    title = models.CharField(max_length=20)
    email = models.CharField(max_length=20)

class Book2(models.Model):
    name = models.CharField(max_length=20)
    # 1查询多,book__set  等于加related_name;多对多两种方式:1,through,加入第三张表;另一种方式不加自动生成第三章表
    authors = models.ManyToManyField(Author2,through='BookAuthor2',related_name='book')
    publilsher = models.ForeignKey(Publisher2)
class BookAuthor2(models.Model):
    author = models.ForeignKey(Author2,on_delete=models.CASCADE)
    book = models.ForeignKey(Book2)

与第一种方式不同之处在于给ManyToManyField添加through,并创建了多对多的关联表BookAuthor2

创建方式:

def save():
    publisher = Publisher2.objects.create(name='海淀出版社',address='五道口')
    author1 = Author2.objects.create(title='老王',email='laowang@qq.com')
    book = Book2.objects.create(name='语文',publilsher=publisher)
    BookAuthor2.objects.create(author=author1,book=book)

直接给关系表加入关系即可

查询方式:

def search():
    # 普通查询
    # print(Author.objects.all())
    # print(Author.objects.get(title='老王'))
    # print(Author.objects.count())
    # 过滤查询
    # print(Author.objects.filter(title='老李'))
    # print(Author.objects.filter(id__gt=0))
    # print(Publisher.objects.filter(id__exact=3))
    # print(Publisher.objects.get(id=3))
    # 关联查询  一查询多
    # p = Publisher.objects.get(id=5)
    # print(p.book_set.all())
    # 关联查询 多查询一
    # print(Book.objects.get(id=2).publilsher)
    # 多对多关联查询
    print(Book2.objects.get(id=2).authors.all())
    print(Author2.objects.get(id=2).book.all())

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值