接着前面的例子,举例多表查询实例如下:

1.查询作战的所有完整信息。

>>> AuthorDetail.objects.values('sex','email','address','birthday','author__name')

2.查询《持续集成实践》这本书的作者姓名,还有出版社的名字

>>> Book.objects.filter(title='持续集成实践').values('authors__name','publisher__name')

3.查询潘晓明写了一些什么书

>>> Book.objects.filter(authors__name='潘晓明').values('title')

4.查询机械工业出版社都出版了一些什么书籍

>>> Book.objects.filter(publisher__name='机械工业出版社').values('title')
>>> publisher = Publisher.objects.get(name='机械工业出版社')
>>> publisher.book_set.all().values('title')

5.查询机械工业出版社都有哪些作者出过书

>>> Book.objects.filter(publisher__name='机械工业出版社').values('title','authors__name')

多表查询技巧:

__:两个下划线可以生成连接查询,查询关联的字段信息

_set:提供了对象访问相关联表数据的方法。但这种方法只能是相关类访问定义了关系的类(主键类访问外键类)。

ManyToMany

多对多之查询:

正向查询:查询书籍id=1的所有作者

b1=Book.objects.get(id=1)
b1.authors.all()

反向查询:查询id=3的作者所出版的所有书籍

a1=Author.objects.get(id=3)
a1.book_set.all()

正向联表查询:查询书籍id=1的所有作者

Book.objects.filter(id=1).values('authors__name')

反向联表查询:查询id=3的作者所出版的所有书籍

Author.objects.filter(id=3).values('book__title')

多对多添加:

正向添加:

b1=Book.objects.get(id=1)
a1=Author.objects.get(id=2)
b1.authors.add(a1) #可以直接添加obj
b1.authors.add(3) #可以直接添加id au_list=Author.objects.all()
b1.authors.add(*au_list) #可以直接添加obj列表
b1.authors.add(*[1,2,3]) #可以直接添加id列表

反向添加:

a2=Author.objects.get(id=1)
b2=Book.objects.get(id=2)
a2.book_set.add(b2)
a2.book_set.add(3) a2.book_set.add(*Book.objects.all())
a2.book_set.add(*[1,2,3,4])

多对多删除:

多对多的删除有两个参数:

  • clear() 清空数据
  • remove() 删除数据

正向删除:

# 删除id=1的书籍的所有作者
b1=Book.objects.get(id=1)
b1.authors.clear() # 删除id=2的书籍的作者id=1,2,5
b2=Book.objects.get(id=2)
b2.authors.remove(1)
b2.authors.remove(*[2,5])

反向删除:

# 删除作者id=1的所有书籍
a1=Author.objects.get(id=1)
a1.book_set.clear()

***微信扫一扫,关注“python测试开发圈”,了解更多测试教程!***

Django进阶Model篇006 - 多表关联查询的更多相关文章

  1. Django进阶Model篇—数据库操作(ORM)

    一.数据库配置 django 默认支持sqlite.mysql.oracle.postgresql数据库,像db2和sqlserver之类的数据库需要第三方的支持,具体详见https://docs.d ...

  2. Django进阶Model篇007 - 聚集查询和分组查询

    接着前面的例子,举例聚集查询和分组查询例子如下: 1.查询人民邮电出版社出了多少本书 >>> Book.objects.filter(publisher__name='人民邮电出版社 ...

  3. Django进阶Model篇004 - ORM常用操作

    一.增加 create和save方法 实例: 1.增加一条作者记录 >>> from hello.models import * >>> Author.object ...

  4. Django进阶Model篇002 - 模型类的定义

    一.创建数据模型. 实例: 作者模型:一个作者有姓名. 作者详情模型:把作者的详情放到详情表,包含性别.email 地址和出生日期,作者详情模型与作者模型之间是一对一的关系(OneToOneField ...

  5. Django进阶Model篇008 - 使用原生sql

    注意:使用原生sql的方式主要目的是解决一些很复杂的sql不能用ORM的方式写出的问题. 一.extra:结果集修改器-一种提供额外查询参数的机制 二.执行原始sql并返回模型实例 三.直接执行自定义 ...

  6. Django进阶Model篇005 - QuerySet常用的API

    django.db.models.query.QuerySet QuerySet特点: 1.可迭代 2.可切片 查询相关API 1.get(**kwargs):返回与所给的筛选条件相匹配的对象,返回结 ...

  7. Django进阶Model篇001 - mysql 数据库的配置

    django 默认支持sqlite.mysql.oracle.postgresql数据库,像db2和sqlserver之类的数据库需要第三方的支持,具体详见: https://docs.djangop ...

  8. Django进阶Model篇003 - 数据库同步技巧

    一.认识一个目录 目录名:migrations 作用:用来存放通过makemigrations命令生成的数据库脚本,不熟悉的情况下,里面生成的脚本不要轻易修改.app目录下必须要有migrations ...

  9. Django基础——Model篇(三)

    一 Django ORM中的概念 ORM —— 关系对象映射,是Object Relational Mapping的简写,是用来简化数据库操作的框架 Django ORM遵循Code Frist原则, ...

随机推荐

  1. js实现模糊查询

    1.简述 实现模糊查询方法有很多种,后端可以实现,前端使用js也可以实现. 后端实现起来需要根据输入框中搜索的关键字,去后台拼接SQL语句查询. 前端直接使用字符串的indexOf()方法或者正则表达 ...

  2. selectedIndex返回被选中的option的index.

    / <label for="city">城市</label> <select id="city" name="schoo ...

  3. 5.MongoDB CRUD Operations-官方文档摘录

    总结 1. CRUD:create, read, update, and delete DOCUMENT 2.在3.2版本的插入方式 db.collection.insertOne() db.coll ...

  4. spring-知识小结之注解为属性赋值

    <1>.本类中的属性赋值 public class UserServiceImpl implements UserService { //按照类别赋值 // @Autowired //按照 ...

  5. sql server升级打补丁

    原本:https://blog.csdn.net/kk185800961/article/details/72436415 sql server升级 sql server打补丁 sql server升 ...

  6. beego——事务处理和命令模式

    1.事务处理 ORM 可以简单的进行事务操作. o := NewOrm() err := o.Begin() // 事务处理过程 ... ... // 此过程中的所有使用 o Ormer 对象的查询都 ...

  7. Php ArrayIterator的几个常用方法

    搜索商低..从php.net找到 ,自己翻译一下 总结在一起   rewind()    指针回到初始位置 valid()        判断数组当前指针下是否有元素 key()        数组键 ...

  8. git--公司中暂时用到的命令操作

    使用的版本控制工具  git + phabricator arc Phabricator是软件开发管理工具,集成了code review, task tracking, version control ...

  9. 关于maven包冲突的一些思路

    在最近的项目中出现了很多包冲突,有时一下子就能猜到错误,但是有写往往需要很久都不能定位问题,尤其是项目人员参差不齐,有时为了方便私自引入一些工具类,而未考虑到项目本身. maven的出现方便了我们的包 ...

  10. HDU 1501 Zipper 【DFS+剪枝】

    HDU 1501 Zipper [DFS+剪枝] Problem Description Given three strings, you are to determine whether the t ...