一.(第一种多对多方式,自动生成第三张关联表)创建三张表,出版社/作者/图书表
出版社和图书 是一对多
作者和图书 是多对多
模型:
# 出版社
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())