案例一:
from django.db import models class Book(models.Model): name = models.CharField(max_length=33) # 创建数据,当然不在此处设置,制只做示例演示 # models.Book.objects.create(name='书名') class Author(models.Model): name = models.CharField(max_length=33) # Django此时帮我们生成第三张表 # 因为没有单独的第三张表的类,所以需要我们间接的操作 # 通过Book,Author都可以进行操作 m = models.ManyToManyField("Book") # 形同虚设,跟Book,Author表都没关系 # 创建数据,当然不在此处设置,制只做示例演示 # models.Author.objects.create(name='人名') # 正向查找数据[先找到人后根据obj.m查找书名] # 查询一: 消耗内存 author_obj = models.Author.objects.get(id=1) author_list = author_obj.m.all() # 获取这个人所写的全部书 for author in author_list: # 需要多次查找数据库,很消耗内存 print(author.name, author.m.all()) # 查询二: 联表一次查询所有的数据 author_obj = models.Author.objects.values("id", "m", "name") # 里面有m这个外键属性 author_obj2 = models.Author.objects.values("id", "m", "m__name" "name") # m可以联表取值 for item in author_list: # 查询到全部跟作者有关的书的ID[第三张表关联的就是ID] print(item['id'], item['name'], '书籍ID:', item['m']) # 反向查找数据 book_obj = models.Book.objects.get(id=1) # 先查找到书 book_obj.author_set.all() # 间接关联第三张表,查找书的作者 # 数据的添加 # 正向增加 obj = models.Author.objects.get(id=1) obj.m.add("可以添加Book的对象") # 不推荐,因为多了一次的查询次数 obj.m.add(5) # 第三张表中添加数据[对应关系,表示obj对象关联了M表中id=5这个Book对象] obj.m.add(5, 6) # 第三张表中添加数据[对应关系,表示obj对象关联了M表中id=5/6这个Book对象] obj.m.add(*[4, 5]) # 第三张表中添加数据[对应关系,表示obj对象关联了M表中id=4/5这个Book对象] # 数据的删除 obj = models.Author.objects.get(id=1) obj.m.remove(5) obj.m.remove(5, 6) obj.m.remove(*[5, 6]) # 数据的清空 obj = models.Author.objects.get(id=1) obj.m.clear() # 清空obj对象关联的所有数据 # 数据的更新 obj = models.Author.objects.get(id=1) # 必须是迭代对象 obj.m.set([1, ]) # 此时将book_id设置为1, author_id设置为1[因为获取的Author的ID是1] # set里面的值数据库内有则保留,没有则删除 obj.m.set([1, 4, 5]) # 此时将book_id设置为4,5 author_id设置为1[会删除原来的1] # 反向操作【其余同上】 obj = models.Book.objects.get(id=1) obj.author_set.add(1) obj.author_set.add(1, 2, 3, 4) ...