ORM正向和反向查询
表结构
from django.db import models # Create your models here.
class Publisher(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32) class Book(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32) publisher = models.ForeignKey('Publisher', related_name='person_book', related_query_name='ooxx')
插入数据
# Book表
id title pubtime person_id
1 书1 1533225600000 1
2 书2 1533225600000 1
3 书3 1534435200000 1
4 书4 1535644800000 2
5 书5 1535126400000 3
# Publisher表
id name
1 出版社1
2 出版社2
3 出版社3
正向查询: 外键所在表去查另一张表,Book >> Publisher
反向查询:普通表去查外键所在的表,Publisher >> Book
正向查询,基于对象跨表查询
book_obj = models.Book.objects.all() # 取到书籍对象
book_obj.publisher.name # 书籍的出版社名字,html
book_obj.person.id # 书籍的出版社id,html
跨表查询,利用双下划线跨表查询
models.Book.objects.filter(id=1).values('publisher__name') # 查询id是1的书的出版社的名字,一条双下划线就是跨一张表
models.Book.objects.filter(id=1).values_list('publisher__name')
反向查询
对象查询 obj.表名_set()
publisher_obj = models.Publisher.objects.first() # 找到第一个出版社对象
ret = publisher_obj.book_set.all() # 找到第一个出版社出版的所有数
for i in ret: # 循环对象
print(i.name) # 打印出每一个书的书名
publisher_obj = models.Publisher.objects.first() # 找到第一个出版社对象
books = publisher_obj.book_set.all() # 找到第一个出版社出版的所有书
titles = books.values_list("name") # 找到第一个出版社出版的所有书的书名
print(titles)
因为使用了releted_name,就是用person_book代替了表字段名字
表字段person = models.ForeignKey(Person, related_name='person_book')
所以这一这样写
books = publisher_obj.person_book.all()
titles = books.values_list('name')
print(titles)
如果表字段person = models.ForeignKey(Person, related_name='person_book',related_query_name="xxoo")
related_query_name="xxoo",这里表示跨表查询xxoo代替表的名字book
books = publisher_obj.ooxx_set.all()
基于双下划线
ret = models.Publisher.objects.filter(id=1).values_list('person_book__name')
person_book是通过releted_name给对应关系起的名字,通过person_book就找到了关联的表,再通过双下划线找到name
print(ret)
附带django里面脚本的代码
import os if __name__ == '__main__':
# 加载Django项目的配置信息
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "项目名.settings")
# 导入Django,并启动Django项目
import django
django.setup() from app01 import models
# 查询id为1的出版社出版的所有书的name
ret = models.Publisher.objects.filter(id=1).values_list('person_book__name')
print(ret)
ORM正向和反向查询的更多相关文章
- (19)模型层 -ORM之msql 跨表查询(正向和反向查询)
基于对象的跨表查询 基于对象的跨表查询'''正向和反向查询'''# 正向 ----> 关联字段在当前表中,从当前表向外查叫正向# 反向 ---> 关联字段不在当前表中,当当前表向外查叫反向 ...
- ORM查询之基于对象的正向查询与反向查询
一.为什么有正向查询和反向查询? 举例有两张表,一张表叫书籍表,一张表叫出版社表,他们关系是一对多的关系,书籍是多,出版社是一,因为一本书应该只有一个出版社对应,而出版社可以有多本书对应. 那么在实际 ...
- ORM 创建manytomay的三种方法 反向查询 和一些 双下方法版学员管理系统3
老师信息管理 三种创建多对对外键的方式常用第二种和第三种 思考 三种方式创建多对多外键方式及其优缺点. 外键的查询和使用 1外键的创建: 在数据库表中的表现形式 如何连表查询和使用 表里边: s ...
- 【mybatis】mybatis 查询mysql 长编码的查询使用 正向查询和反向查询,避免数据库关系 递归查询的 解决方案
长编码存储规则为: 父级长编码+":"+自己的uid 例如最顶级GoodsType-->uid = 123 --->longCode= 123: 子级GoodsTyp ...
- django ORM model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct
版权归作者所有,任何形式转载请联系作者.作者:petanne(来自豆瓣)来源:https://www.douban.com/note/301166150/ 1.多表连接查询:感觉django太NX了. ...
- Django ORM 反向查询
一/一对多反向查询 先定义两个模型,一个是A,一个是B,是一对多的类型. class A(models.Model): name= models.CharField('名称', max_lengt ...
- ORM 多表操作查询及增删改查
------------------------------------------只有对前途乐观的人,才能不怕黑暗,才能有力量去创造光明.乐观不是目的,而是人生旅途中的一种态度. 多表操作 创建模型 ...
- ORM的多表查询详述
ORM的多表查询 ORM最核心与用的最多的地方就是跨表查询了.这里的"跨表查询"分为以下几种:基于对象的跨表查询.基于双下划线的跨表查询.聚合查询.F与Q查询以及分组查询. 下面就 ...
- 10 ORM 多表操作 查询
1.子查询:基于对象的跨表查询 def query(request): """ 跨表查询: 1.基于对象查询 2.基于双下划线查询 3.聚合.分组查询 4. F Q 查询 ...
随机推荐
- 如何Python下载大文件?
我想用python脚本下载很多文件,但是经常就有那么几个出错,写了个error handling,跳了过去,但是把出错的链接保存了一下. 转过天来,研究了一下出的什么错. 一个报错如下: PS C:\ ...
- MySQL在默认事务下各SQL语句使用的锁分析
数据库使用锁是为了支持更好的并发,提供数据的完整性和一致性.InnoDB是一个支持行锁的存储引擎,锁的类型有:共享锁(S).排他锁(X).意向共享(IS).意向排他(IX).为了提供更好的并发,Inn ...
- Java Arrays.sort源代码解析
前提: 当用到scala的sortWith,发现: def sortWith(lt: (A, A) ⇒ Boolean): List[A] // A为列表元素类型 根据指定比较函数lt进行排序,且排序 ...
- 安装二维码、条形码识别工具zbar
参考:http://blog.csdn.net/gaofuqi/article/details/26698547 http://www.imagemagick.org/download/ImageMa ...
- Mybatis3——使用学习(一)
目录 Mybatis Mybatis参考资源 Mybatis 使用 肯定TM要跑起来 XML映射配置文件 Mapper XML 文件 Mybatis Mybatis参考资源 Mybatis官网手册:h ...
- 【Android】详解Android Service
目录结构: contents structure [+] Service简单概述 Service在清单文件中的声明 Service启动服务 Service绑定服务 扩展Binder类 使用Messen ...
- Android BLE蓝牙开发-读写数据 获取UUID
https://www.jianshu.com/p/3711cfbf7128 一个ble蓝牙设备有多个包括多个Profile 一个Profile中有多个服务Service(通过服务的uuid找到对应的 ...
- Spark 核心篇-SparkEnv
本章内容: 1.功能概述 SparkEnv是Spark的执行环境对象,其中包括与众多Executor执行相关的对象.Spark 对任务的计算都依托于 Executor 的能力,所有的 Executor ...
- 改变R和Matlab的默认工作目录
在快捷方式上右键->属性->起始位置处填上你需要的默认工作目录即可
- 最好的Python机器学习库
参考链接:http://www.csdn.net/article/2015-12-10/2826435