通过对象进行多表查询

  • 由一到多查询:一类模型类对象名.小写多类模型类类名_set.查询函数()
    通过对象查询分成2步,先查到某本图书,再通过该图书对象查询该图书中的人物对象
    实例演练: 查询id为1的图书中,所有人物的信息
    修改views.py文件
def index(request):book = BookInfo.objects.get(id=1)persons = book.personinfo_set.all()ret = ''for p in persons:ret += str(p.id) + ", " + p.pname + ", " + str(p.pgender) \+ ", " + p.pcomment + ", " + str(p.hbook_id)ret += '<br>'return HttpResponse(ret)
1, 曹操, True, 字孟德, 1
2, 刘备, True, 字玄德, 1
3, 诸葛亮, True, 字孔明, 1
4, 孙权, True, 字仲谋, 1
  • 由多到一查询:多类模型类对象名.多类模型类中外键对应的属性名
    通过对象查询分成2步,先查到某个人物,再通过该人物对象查询其所在的图书对象
    实例演练: 查询id为1的人物所在的图书信息
    修改views.py文件
def index(request):person = PersonInfo.objects.get(id=1)book = person.hbookret = book.btitle + ", " + str(book.bpub_date) + ", " \+ str(book.bread) + ", " + str(book.bcomment)return HttpResponse(ret)
三国演义, 1980-05-01, 12, 34

通过模型类进行多表查询

  • 由一到多查询:一类模型类名.objects.filter(小写多类模型类名__属性名__条件运算符 = 值)
    实例演练: 查询图书,要求图书中人物描述包含'德'字
    修改views.py文件
def index(request):books = BookInfo.objects.filter(personinfo__pcomment__contains='德')ret = ''for book in books:ret += book.btitle + ", " + str(book.bpub_date) + ", " \+ str(book.bread) + ", " + str(book.bcomment)ret += '<br>'return HttpResponse(ret)
三国演义, 1980-05-01, 12, 34
三国演义, 1980-05-01, 12, 34

如果没有__运算符部分,表示等于

  • 由多到一查询:多类模型类名.objects.filter(多类模型类外键的属性名__一类模型类属性名__条件运算符 = 值)
    实例演练: 查询“西游记”中的所有人物
    修改views.py文件
def index(request):persons = PersonInfo.objects.filter(hbook__btitle='西游记')ret = ''for p in persons:ret += str(p.id) + ", " + p.pname + ", " + str(p.pgender) \+ ", " + p.pcomment + ", " + str(p.hbook_id)ret += '<br>'return HttpResponse(ret)
14, 孙悟空, True, 唐僧的大徒弟, 4
15, 唐僧, True, 玄奘, 4
16, 猪八戒, True, 悟能, 4
17, 沙僧, True, 沙悟净, 4

多对多查询

  • 对于复杂的多对多查询,可以使用原生SQL来处理,参考文档
  • 语法格式:模型类名.objects.raw('SQL语句', params=None, translations=None)
  • 实例演练: 查询所有新闻标题、内容及其类型
    Python Console中执行
list = NewsInfo.objects.raw('''SELECT * FROM app_newsinfo n, app_typeinfo t, app_newsinfo_ntype nt WHERE n.id = nt.newsinfo_id AND t.id = nt.typeinfo_id''')
  • 用来查询的模型类,使用NewsInfoTypeInfo都可以
  • 返回值的类型为RawQuerySet
for l in list:print(l.ntitle, l.ncontent, l.tname)
互联网科技 马云已退出阿里旗下5家公司:官方称没这个打算 科技
宇宙探索 平行时空、多元宇宙真的存在?令人细思极恐 科技
中国军情 中国海军万吨巨舰的起点 原型就是这艘民船 科技
国际军情 美国国会议员:前总统吉米·卡特请缨亲赴朝鲜 军事
欧洲 欧盟高官警告:特朗普不要搞垮了世贸体系 军事
数码产品 苹果官方科普来了:全面认识Apple ID 国际
国际军情 美国国会议员:前总统吉米·卡特请缨亲赴朝鲜 国际
欧洲 欧盟高官警告:特朗普不要搞垮了世贸体系 国际
美国 伊拉克北部发生汽车炸弹袭击致1死7伤 国际

自连接

对于地区信息数据表,表结构非常相似,可以设计成一张表,通过自连接产生相关信息

上图中,通过查询地区表(AreaInfo),可以产生省表和市区表
还可以通过自连接产生省市区对照表

通过Django实现自连接

  • 修改models.py文件,添加AreaInfo模型类。
    外键关连表使用self指向本类,nullblank参数允许为空,因为一级数据没有父数据
定义地区模型类AreaInfo,存储省、市、区县信息class AreaInfo(models.Model):atitle = models.CharField(max_length=30)  # 地区名称# 上级地区aParent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE)
  • 进行数据迁移,生成数据表
python manage.py makemigrations
python manage.py migrate

生成数据表app_areainfo,并将外键aParent_id关联到本身的主键id

  • 添加测试数据
    SQLyog中执行插入语句
INSERT INTO app_areainfo VALUES
('210000', '辽宁省', NULL),
('210100', '沈阳市', '210000'),
('210102', '和平区', '210100'),
('210103', '沈河区', '210100'),
('210104', '大东区', '210100'),
('210105', '皇姑区', '210100'),
('210106', '铁西区', '210100'),
('210200', '大连市', '210000'),
('210202', '中山区', '210200'),
('210203', '西岗区', '210200'),
('210204', '沙河口区', '210200'),
('210211', '甘井子区', '210200'),
('210300', '鞍山市', '210000'),
('210302', '铁东区', '210300'),
('210303', '铁西区', '210300'),
('210304', '立山区', '210300'),
('210311', '千山区', '210300'),
('220000', '吉林省', NULL),
('220100', '长春市', '220000'),
('230000', '黑龙江省', NULL),
('230100', '哈尔滨市', '230000')
  • 实例演练: 使用SQL语句分别查询省表、市区表、省市对照表
SELECT * FROM app_areainfo WHERE aParent_id IS NULL
SELECT * FROM app_areainfo WHERE aParent_id IS NOT NULL
SELECT p.atitle, c.atitle
FROM app_areainfo p, app_areainfo c
WHERE p.id = c.aParent_id

通过Django实现查询
语法格式:查询上级,area.aParent,查询下级,area.areainfo_set.all()

  • 实例演练: 查询沈阳市的上级地区
    修改views.py文件
def area(request):area = AreaInfo.objects.get(pk=210100)  # 获得沈阳市的对象ret = area.atitle + ", " + area.aParent.atitle  # 通过对象查询上级return HttpResponse(ret)
沈阳市, 辽宁省
  • 实例演练: 查询辽宁省的下级地区
    修改views.py文件
def area(request):area = AreaInfo.objects.get(pk=210000)  # 获得辽宁省的对象ret = ""for area in area.areainfo_set.all():  # 通过对象查询下级ret += area.atitleret += '<br>'return HttpResponse(ret)
沈阳市
大连市
鞍山市

课堂练习:

  • 创建empdept表,表结构如下图:

  • 添加测试数据
INSERT  INTO app_dept VALUES
(10,'ACCOUNTING','NEW YORK'),
(20,'RESEARCH','DALLAS'),
(30,'SALES','CHICAGO'),
(40,'OPERATIONS','BOSTON');
INSERT INTO app_emp VALUES
(7369,'SMITH','CLERK',7902,'1980-12-17','800.00',NULL,20),
(7499,'ALLEN','SALESMAN',7698,'1981-02-20','1600.00','300.00',30),
(7521,'WARD','SALESMAN',7698,'1981-02-22','1250.00','500.00',30),
(7566,'JONES','MANAGER',7839,'1981-04-02','2975.00',NULL,20),
(7654,'MARTIN','SALESMAN',7698,'1981-09-28','1250.00','1400.00',30),
(7698,'BLAKE','MANAGER',7839,'1981-05-01','2850.00',NULL,30),
(7782,'CLARK','MANAGER',7839,'1981-06-09','2450.00',NULL,10),
(7788,'SCOTT','ANALYST',7566,'1987-04-19','3000.00',NULL,20),
(7839,'KING','PRESIDENT',NULL,'1981-11-17','5000.00',NULL,10),
(7844,'TURNER','SALESMAN',7698,'1981-09-08','1500.00','0.00',30),
(7876,'ADAMS','CLERK',7788,'1987-05-23','1100.00',NULL,20),
(7900,'JAMES','CLERK',7698,'1981-12-03','950.00',NULL,30),
(7902,'FORD','ANALYST',7566,'1981-12-03','3000.00',NULL,20),
(7934,'MILLER','CLERK',7782,'1982-01-23','1300.00',NULL,10);
  • 使用Django完成如下查询操作
    查询dept表中的所有列信息
    查询emp表中的员工姓名、月收入及部门编号
    查询emp表中的部门编号及工种,并去掉重复行
    查询emp表中的员工姓名及全年的收入
    查询月收入大于2000的员工姓名及月收入
    查询月收入在1000元到2000元的员工姓名、月收入及雇佣时间。
    查询以S开头的员工姓名及月收入。
    查询员工姓名中的第三个字符是A的员工姓名及月收入。
    查询emp表中月收入是800的或是1250的员工姓名及部门编号
    查询在部门20中岗位CLERK的所有雇员信息
    查询工资高于2500或岗位为MANAGER的所有雇员信息
    查询有奖金 (COMM不为空,且不为0) 的员工姓名,按工资排序
    查询不带有'R'的雇员姓名

第七章、模型详解 -- 多表查询相关推荐

  1. OSI七层模型详解物理层、数据链路层、网络层、传输层.....应用层协议

    OSI七层模型详解(物理层.数据链路层.网络层.传输层.....应用层协议与硬件) OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能就是帮助不同类型 ...

  2. OSI七层模型详解——物理层

    在阅读本篇文章之前建议您了解信道及工作栈的基本原理,详情可以观看OSI七层模型详解--信道与协议栈 OSI模型概述 OSI全称为"Open System Interconnection&qu ...

  3. 初识网络基础《网络七层模型详解》

    坚持原创输出,点击蓝字关注我吧 图片来自网络 目录 一.初识网络基础 二.网络七层模型详解 1.物理层 2.数据链路层 3.网络层 4.传输层 5.会话层 6.表示层 7.应用层 三.总结 一.初识网 ...

  4. mysql单表查询实例_MySQL简单查询详解-单表查询

    MySQL简单查询详解-单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询的执行路径 一条SQL查询语句的执行过程大致如下图所示: 1>.客户端和服务端通过my ...

  5. OSI的七层模型详解

    各层功能定义 这里我们只对OSI各层进行功能上的大概阐述,不详细深究,因为每一层实际都是一个复杂的层.后面我也会根据个人方向展开部分层的深入学习.这里我们就大概了解一下.我们从最顶层--应用层 开始介 ...

  6. OSI七层模型详解-开放系统互联参考模型详解

    原文链接:https://blog.csdn.net/yaopeng_2005/article/details/7064869 OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可 ...

  7. OSI七层模型详解 TCP/IP协议

    总结 OSI中的层 功能 TCP/IP协议族 应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等 表示层 数据格式化,代码转换, ...

  8. 网络OSI七层模型详解(物理层、数据链路层、网络层、传输层.....应用层协议与硬件)

    OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能就是帮助不同类型的主机实现数据传输 . 完成中继功能的节点通常称为中继系统.在OSI七层模型中,处于 ...

  9. (转)OSI七层模型详解

    http://www.2cto.com/net/201208/149565.html TCP三次握手   所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和 ...

最新文章

  1. 【Python金融量化 6- 100 】、六、蒙特卡洛预测微软股票
  2. gitlens突然不显示了_损失百万!预防LED显示屏火灾隐患,从三方面入手
  3. 洛谷 P1939 【模板】矩阵加速(数列)
  4. centos 8 kubernetes安装详解_8方面图文详解,电气安装工程施工工艺!
  5. IIS7配置PHP 报错 对找不到的文件启用文件监视
  6. 实体经济的“数字化”是不可逆转的趋势
  7. G2.9 std_alloc
  8. mplayer-ww-37356 compile with mingw gcc 4.5.1 修复无法播放wmv
  9. 人体面部检测python_使用Python检测面部特征
  10. Composer Laravel 下载安装
  11. 手把手教你给小米游戏本安装macOS
  12. 【考试总结贴】控制测量学
  13. hp39gs运行C语言,HP39GS 硬改添加Flash(w25q32)
  14. linux添加开机启动项
  15. 安装docker与docker镜像和容器基本的基本操作
  16. TransE论文第4节:实验
  17. 组件-Element—Timeline(时间线)
  18. MIPS汇编模拟器_Mars的使用
  19. java五子棋游戏源代码_Java实现五子棋游戏的完整代码
  20. pgpool mysql_pgpool分析二

热门文章

  1. python3: format函数
  2. 微软账户可以和outlook邮箱不一样吗
  3. linux下非root用户获得/dev/ttyUSB0的权限
  4. 【黑马程序员】 学习笔记 - Html开发
  5. python中遍历是什么意思_谈谈python中的遍历
  6. unity-阴影、烘培、光照贴图
  7. Google Earth Engine 教程——Landsat 8 影像集合去云分析QA波段和去云NDVI的影像
  8. 解决“fatal: ‘origin‘ does not appear to be a git repository...”
  9. 设置动画的播放方向,状态,时间外属性
  10. oracle的逻辑读、物理读总结