嘻哈飞车族|Django之ORM表高级操作、增删改查、F/Q查询等( 四 )

# 获取对象author_obj = models.Author.objects.get(pk=1)author_obj1 = models.Author.objects.get(pk=3)# 添加绑定关系book_obj.authors.add(author_obj)book_obj.authors.add(author_obj,author_obj1)2.移除绑定关系 removeremove专门给第三张关系表移除数据括号内即可以传数字也可以传对象并且都支持传多个# 按照具体外键的值进行删除book_obj = models.Book.objects.filter(pk=1).first()book_obj.authors.remove(2)book_obj.authors.remove(1,3)# 获取相关对象删除author_obj = models.Author.objects.get(pk=2)author_obj1 = models.Author.objects.get(pk=3)book_obj.authors.remove(author_obj)book_obj.authors.remove(author_obj,author_obj1)3.修改绑定关系 set set 修改书籍与作者的关系括号内支持传数字和对象 但是需要是可迭代对象# authors外键字段 , Author类名book_obj = models.Book.objects.filter(pk=1).first()book_obj.authors.set((3,))book_obj.authors.set((2,3))author_obj = models.Author.objects.get(pk=2)author_obj1 = models.Author.objects.get(pk=3)book_obj.authors.set([author_obj,author_obj1])# 可迭代对象4.清空关系clear()清空关系不需要任何的参数book_obj = models.Book.objects.filter(pk=1).first()book_obj.authors.clear()# 去第三张表中清空书籍为1的所有数据六、跨表查询mysql中跨表查询的方式1.子查询将一张表的查询结果当做另外一张表的查询条件正常解决问题的思路 分步操作2.链表查询inner joinleft joinright joinunion正反向的概念正向跨表查询的时候 外键字段是否在当前数据对象中 如果在查询另外一张关系表叫正向反向如果不在叫反向口诀正向查询按外键字段反向查询按表名小写案例:
正向查询的时候 当外键字段对应的数据可以有多个的时候需要加.all()否则点外键字典即可获取到对应的数据对象基于对象的反向查询 表名小写是否需要加_set.all()一对多和多对多的时候需要加 , 查询有多个结果 。加_set.all()一对一不需要 , 查询只有一个结果不加1.基于对象的跨表查询(子查询):# 1.查询书籍pk为1的出版社名称book_obj = models.Book.objects.filter(pk=1).first()print(book_obj.publish.name)# 2.查询书籍pk为2的所有作者的姓名 book_obj = models.Book.objects.filter(pk=2).first()author_list = book_obj.authors.all()for author_obj in author_list:print(author_obj.name)# 3.查询作者pk为1的电话号码 author_obj = models.Author.objects.filter(pk=1).first()print(author_obj.author_detail.phone) # 4.查询出版社名称为东方出版社出版过的书籍 publish_obj = models.Publish.objects.filter(name='东方出版社').first() print(publish_obj.book_set.all())# 5.查询作者为jason写过的书 author_obj = models.Author.objects.filter(name='jason').first()print(author_obj.book_set.all())# 6.查询手机号为120的作者姓名 author_detail_obj = models.AuthorDetail.objects.filter(phone=120).first()print(author_detail_obj.author.name)2.基于双下划线跨表查询(链表查询)只要表之间有关系你就可以通过正向的外键字段或者反向的表名小写 连续跨表操作# 1.查询书籍pk为1的出版社名称# 正向res = models.Book.objects.filter(pk=1).values('publish__name')# 写外键字段 就意味着你已经在外键字段管理的那张表中print(res)# 反向res = models.Publish.objects.filter(book__pk=1)# 拿出版过pk为1的书籍对应的出版社res = models.Publish.objects.filter(book__pk=1).values('name')print(res)# 2.查询书籍pk为1的作者姓名和年龄# 正向res = models.Book.objects.filter(pk=1).values('title','authors__name','authors__age')print(res)# 反向res = models.Author.objects.filter(book__pk=1)# 拿出出版过书籍pk为1的作者res = models.Author.objects.filter(book__pk=1).values('name','age','book__title')print(res)# 3.查询作者是jason的年龄和手机号# 正向res = models.Author.objects.filter(name='jason').values('age','author_detail__phone')print(res)# 反向res = models.AuthorDetail.objects.filter(author__name='jason')# 拿到jason的个人详情res = models.AuthorDetail.objects.filter(author__name='jason').values('phone','author__age')print(res)# 4.查询书籍pk为的1的作者的手机号# 正向# 只要表之间有关系你就可以通过正向的外键字段或者反向的表名小写 连续跨表操作res = models.Book.objects.filter(pk=1).values('authors__author_detail__phone')print(res)# 反向res = models.AuthorDetail.objects.filter(author__book__pk=1).values('phone')print(res)