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

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. Linux入门之运维(1) 系统监控 vmstat top

    vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况.这个命令是我查看Linux/Unix最 ...

  2. Vue(2)- v-model、局部组件和全局组件、父子组件传值、平行组件传值

    一.表单输入绑定(v-model 指令) 可以用 v-model 指令在表单 <input>.<textarea> 及 <select> 元素上创建双向数据绑定. ...

  3. 【POJ3615】Cow Hurdles 最短路,你若LCA,我仍不拦你。

    NOIP2013货车运输.仅仅只是数据范围小了很多. 不到150s打完而且AC. . 额.当然.我写的是Floyd. 写LCA的真过分. #include <cstdio> #includ ...

  4. 安装RabbitMQ3.6.10报错:{error,{missing_dependencies,[crypto,ssl],

    参考https://blog.csdn.net/u010739551/article/details/80848993 如果安装上篇博文安装则可避免这种情况 CentOS6.7安装RabbitMQ3. ...

  5. 对数值数据的格式化处理(保留小数点后N位)

    项目中有时会遇到对数值部分进行保留操作,列如保留小数点后2位,所有的数据都按这种格式处理, //保留小数点后2位,都按这种格式处理,没有补0 DecimalFormat df = new Decima ...

  6. HDU1506: Largest Rectangle in a Histogram(最大子矩阵,好题动态优化左右边界)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1506 刚开始没考虑时间复杂度,直接敲了,直接tle了,之后没有思路,然后看题解,看见大神写的优化非常棒. ...

  7. jdk1.7 ArrayList源码浅析

    参考:http://www.cnblogs.com/xrq730/p/4989451.html(借鉴的有点多,哈哈) 首先介绍ArrayList的特性: 1.允许元素为空.允许重复元素 2.有序,即插 ...

  8. python16_day10【SelectWeb、SelectWget、paramiko、pymysql】

    一.select实现Web框架(自定义WEB框架) 浏览器输入:http://127.0.0.1:8888/index.html import select import socket class F ...

  9. Java基础知识陷阱(一)

    本文发表于本人博客. 事隔好多年了,重新拿起来Java这门语言,看似熟悉其实还很陌生,想想应该梳理下顺便提高下自己.这次先来看看Java里面的String这个对象. 经典的先看下面一段代码,请问最终创 ...

  10. ZOJ 3261 Connections in Galaxy War (逆向+带权并查集)

    题意:有N个星球,每个星球有自己的武力值.星球之间有M条无向边,连通的两个点可以相互呼叫支援,前提是对方的武力值要大于自己.当武力值最大的伙伴有多个时,选择编号最小的.有Q次操作,destroy为切断 ...