嘻哈飞车族|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)
- ZAKER| 男子恼羞成怒小区内上演“亡命飞车”,怀疑老婆出轨
- 案件侦办|怀疑老婆出轨男子恼羞成怒小区内上演“亡命飞车”
- 几品飞车|一大波录取通知书到来 华为nova7 Pro给考后生活添色彩
- 嘻哈小甜甜|Deft卢锡安下路通关打崩Mystic DRX2:0战胜AF
- 上观新闻|研究“王者荣耀KPL”与“QQ飞车”?全球移动电竞文化研究院在沪落地
- 女司机珠海大桥遇惊魂!大车飞车侧翻被压瞬间,她做这件事捡回一命!
- 嘻哈飞车族|FOCAL品牌第一款封闭式大耳 聊聊Elegia近日来的使用感受
- 嘻哈小甜甜|王者荣耀:周年庆回城特效已确定,能量条英雄加强,43位英雄普攻动画优化
- 光明网|怀疑老婆出轨 他恼羞成怒小区内上演“亡命飞车”
- 海峡网|DrakSun孩子王是谁 vava男友也是嘻哈歌手真名个人资料