Django进阶Model篇006 - 多表关联查询
接着前面的例子,举例多表查询实例如下:
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 - 多表关联查询的更多相关文章
- Django进阶Model篇—数据库操作(ORM)
一.数据库配置 django 默认支持sqlite.mysql.oracle.postgresql数据库,像db2和sqlserver之类的数据库需要第三方的支持,具体详见https://docs.d ...
- Django进阶Model篇007 - 聚集查询和分组查询
接着前面的例子,举例聚集查询和分组查询例子如下: 1.查询人民邮电出版社出了多少本书 >>> Book.objects.filter(publisher__name='人民邮电出版社 ...
- Django进阶Model篇004 - ORM常用操作
一.增加 create和save方法 实例: 1.增加一条作者记录 >>> from hello.models import * >>> Author.object ...
- Django进阶Model篇002 - 模型类的定义
一.创建数据模型. 实例: 作者模型:一个作者有姓名. 作者详情模型:把作者的详情放到详情表,包含性别.email 地址和出生日期,作者详情模型与作者模型之间是一对一的关系(OneToOneField ...
- Django进阶Model篇008 - 使用原生sql
注意:使用原生sql的方式主要目的是解决一些很复杂的sql不能用ORM的方式写出的问题. 一.extra:结果集修改器-一种提供额外查询参数的机制 二.执行原始sql并返回模型实例 三.直接执行自定义 ...
- Django进阶Model篇005 - QuerySet常用的API
django.db.models.query.QuerySet QuerySet特点: 1.可迭代 2.可切片 查询相关API 1.get(**kwargs):返回与所给的筛选条件相匹配的对象,返回结 ...
- Django进阶Model篇001 - mysql 数据库的配置
django 默认支持sqlite.mysql.oracle.postgresql数据库,像db2和sqlserver之类的数据库需要第三方的支持,具体详见: https://docs.djangop ...
- Django进阶Model篇003 - 数据库同步技巧
一.认识一个目录 目录名:migrations 作用:用来存放通过makemigrations命令生成的数据库脚本,不熟悉的情况下,里面生成的脚本不要轻易修改.app目录下必须要有migrations ...
- Django基础——Model篇(三)
一 Django ORM中的概念 ORM —— 关系对象映射,是Object Relational Mapping的简写,是用来简化数据库操作的框架 Django ORM遵循Code Frist原则, ...
随机推荐
- appium入门基础知识
1.概念区分: 1)IOS-UIAutomation:随着iOS4.0的发布,苹果公司同时发布了一个名为UIAutomation的测试框架,它可以用来在真实设备和iPhone模拟器上执行自动化测试 学 ...
- 如何让socket编程非阻塞?
import socket # 创建socket client = socket.socket() # 将原来阻塞的位置变成非阻塞(报错) client.setblocking(False) # 百度 ...
- Linux命令之pip
使用pip进行install,sudo pip install xxx 使用pip进行update,sudo pip install --update xxx 使用pip设置超时时间,sudo pip ...
- VIM 配置python
Pre-install sudo yum install automake gcc gcc-c++ kernel-devel cmake sudo yum install python-devel p ...
- BioinfomaticsPPT-1-Introduction
1.人类基因基础 2.基因组规模 3.基因分化表达 4.遗传信息流 5.基因基础知识相关 6.遗传编码 7.序列比对的意义 8.
- go——数组(二)
1.内部实现 在Go语言里,数组是一个长度固定的数据类型,用于存储一段具有相同的类型的元素的连续块. 数组存储的类型可以是内置类型,如整型或字符串,也可以是某种结构类型. 灰格子代表数组里面的元素,每 ...
- php优化,操作码优化,缓存优化
一.php缓存加速器软件种类 xcache,eaccelerator,zend,apc如何选择:建议xcache,eaccelerator,二选一,首选xcachexcache更快 二.php缓存加速 ...
- Why GraphQL is Taking Over APIs
A few years ago, I managed a team at DocuSign that was tasked with re-writing the main DocuSign web ...
- 集合遍历(Set,List,Map)
一.Set遍历 定义一个set Set<String> books = new HashSet<String>(); books.add("Java"); ...
- JMeter接口测试和压力测试
JMeter接口测试和压力测试 JMeter可以做接口测试和压力测试.其中接口测试的简单操作包括做http脚本(发get/post请求.加cookie.加header.加权限认证.上传文件).做web ...