ORM查询之基于对象的正向查询与反向查询
一、为什么有正向查询和反向查询?
举例有两张表,一张表叫书籍表,一张表叫出版社表,他们关系是一对多的关系,书籍是多,出版社是一,因为一本书应该只有一个出版社对应,而出版社可以有多本书对应。
那么在实际代码中定义他们关系的类中,设置外键的那个属性"publisher"是在多的那个类中,也就是在书籍这个类中,所以在书籍类中,想要知道某一本书对应的出版社,就可以通过实例化一个对象,然后通过他的属性publisher又实例化一个出版社的对象,拿到对应的出版社,这个按照python的解释来说,就是正常的通过一个实例化对象,取某一个属性,很正常,逻辑顺序明了,被称之为正向查询;但是在出版社表中,对应的类中,它只有与自己属性相关的定义啊,比如出版社名字,地址等等,它没有属性是来确定和书籍这个表有关系的,所以,想取某一个出版社对应的有哪些书,用实例化一个对象来操作,行不通,这时这种情况就是反向查询了。
两种查询具体怎么操作,如下:
给出两个表对应的类定义和生成的数据表:
书籍类:

生成的对应数据表:

出版社类:

生成的对应数据表:

正向查询
现在通过正向查询,也就是要查询某本书对应的是哪一个出版社。从上面的表中,我们看到,书籍是有重复的,但是出版社是一样的,那么查询ID=2的那本书对应的出版社。
from orm测试.models import Book #导入Book模块 b=Book.objects.filter(id=2)[0]
#当后面不加[0]时,拿到的是一个QuerySet集合,加上就是一个对象,只有对象才能取值。 chubanshe=b.publisher.name
#b已经是书籍的一个对象,b.publisher又是一个对象,这个对象就是出版社的对象,因为#publisher是Book类中的一个外键。b.publisher.name就拿到了对应的出版社名字。 print(chubanshe)
来看看上面代码每一步拿到的都是些什么。
代码:b=Book.objects.filter(id=2)拿到的是什么(不加[0])?如图:

b拿到的是一个QuerySet集合,类型是django类型的类(这个是什么具体还不清楚),但是这个肯定不是我想要的对象。
代码:b=Book.objects.filter(id=2)[0]拿到的是什么?如图:

b输出是一个具体的值?但是实际上并不是,打印它的类型一看就知道,它其实是一个类实例化的一个对象,也就是想要查询id=2这本书叫“三国演义”的对象。
代码:chubanshe=b.publisher.name拿到的是什么?
分开来看这句代码,先看chubanshe=b.publisher是什么?先把b.publisher的值赋给了chubanshe,方便输出查看。
首先publisher是Book类的一个属性,同时也是一个外键,很明显b.publisher是在拿属性的值。看看它拿到的是什么?如图:

看到,结果是跟上面一样,也是一个具体的值,其实就是出版社的一个实例化的一个对象。好了,到这里明白了,既然出版社的一个实例化的对象有了,那么取里面属性的值就很好办了。
代码chubanshe=b.publisher.name拿到的自然就是从一开始想要得到那本书本的对应的出版社的名字:

结果就是想要的,对应的出版社,查表可以确定结果只正确的,并且这个值的类型是字符串类型,一个真正的值。
反向查询
现在通过反向查询,也就是要查询某个出版社对应哪些书。那么查询ID=2这个出版社有哪些书。
既然是反向,出发点一定是从表出版社出发,查到表书籍。
1 from orm测试.models import Publish
2
3 p=Publish.objects.filter(id=2)[0] #这里跟正向查询一样,拿到一个对象
4
5 ret=p.book_set.values("title").distinct() #取出版社对应的所有书
6
7 print(ret)
这里主要分析代码ret=p.book_set.values("title").distinct()
book_set是反向查询的一个方法,book对应的就是要到Book表里面,_set就是拿到了要查询的所有书籍,distinct()是去重。
结果如图:

ORM查询之基于对象的正向查询与反向查询的更多相关文章
- Python学习---ORM查询之基于对象的正向/反向/聚合/分组/Q/F查询
ORM查询之基于对象的正向查询与反向查询 对象形式的查询 # 正向查询 ret1=models.Book.objects.first() print(ret1.title) print(ret1.pr ...
- {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...
- Django框架第七篇(模型层)--多表操作:一对多/多对多增删改,跨表查询(基于对象、基于双下划线跨表查询),聚合查询,分组查询,F查询与Q查询
一.多表操作 一对多字段的增删改(book表和publish表是一对多关系,publish_id字段) 增 create publish_id 传数字 (publish_id是数据库显示的字段名 ...
- Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询
Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...
- (20)模型层 -ORM之msql 基于双下划线的跨表查询(一对一,一对多,多对多)
基于对象的跨表查询是子查询 基于双下划线的查询是连表查询 PS:基于双下划线的跨表查询 正向按字段,反向按表名小写 一对一 需求:查询lqz这个人的地址# 正向查询ret = models.Autho ...
- Django学习——图书相关表关系建立、基于双下划线的跨表查询、聚合查询、分组查询、F查询、Q查询、admin的使用、使用脚本调用Django、Django查看源生sql
0 图书相关表关系建立 1.5个表 2.书籍表,作者表,作者详情表(垂直分表),出版社表,书籍和作者表(多对多关系) 一对一 多对多 本质都是一对多 外键关系 3.一对一的关系,关联字段可以写在任意一 ...
- day056-58 django多表增加和查询基于对象和基于双下划线的多表查询聚合 分组查询 自定义标签过滤器 外部调用django环境 事务和锁
一.多表的创建 from django.db import models # Create your models here. class Author(models.Model): id = mod ...
- django之 使用views.py里面的函数对表进行增删改查 内容(models.py中表的创建、views.py中函数的使用,基于对象的跨表查询)
models之对于表的创建有以下几种: 一对一:ForeignKey("Author",unique=True), OneToOneField("Author" ...
- ORM正向和反向查询
表结构 from django.db import models # Create your models here.class Publisher(models.Model): id = model ...
随机推荐
- 今天是JVM的生日,来了解下JVM的发展历史吧
1991年4月,由James Gosling主导的团队创造了Oak语言,java的前身,1995年5月23号,Oak语言更名Java,并且提出那句注明的:”write Once,Run Anywher ...
- [每天解决一问题系列 - 0013] 如何修改WiX Burn内置的窗口
问题描述: 我们产品的burn安装包仅支持.net 3.5 sp1以上,在只有.net 2.0的机器上会给用户弹一个窗口,告诉用户为什么不能够安装的原因.本来burn已经内置了,但是在日文操作系统下, ...
- (转)tasklist命令参数应用详细图解
原文:https://blog.csdn.net/bcbobo21cn/article/details/51759521 一 操作实例不带参数: /svc参数: /SVC 显示每个进程中的服务信息,当 ...
- Git 强制回退到某个历史版本再推送到远程
1. 使用 git log 命令历史版本记录回退版本 git reset --hard f6a7c803a6931a9eca011d4e097389e0845cbe49 2. 推送到远程 git pu ...
- 《java并发编程实战》
目录 对本书的赞誉 译者序 前 言 第1章 简介 1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更 ...
- 五大常用算法之二:动态规划算法(DP)
一.基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移.一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划. 二.基本思想与策略 基本 ...
- 从零开始学 Web 之 Ajax(七)跨域
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- Xdebug调试环境配置
首先我们需要下载Xdebug 务必根据安装的PHP版本,选择合适的Xdebug版本,由于我是在Windows环境下安装PHP的,选择下载Windows版本的PHP 5.3 VC9 TS (32 bit ...
- 【图文详细教程】maven3安装配置+eclipse离线安装maven3插件《《唯一成功的教程~~~2018-01-09》》
环境搭建前提: 1.电脑上已经安装了1.7以及以上版本的JDK(因为我提供的maven版本是最新的3.3.9的,要求最低JDK1.7) 2.配置好了ecplise并且能正常启动 第一步:下载maven ...
- MySQL之库、表操作
一.库操作 创建库 create database 库名(charset utf8 对库的编码进行设置,不写就用默认值) 库名可以由字母.数字.下划线.特殊字符,要区分大小写,唯一性,不能使用关键字, ...