多表操作
基于对象的跨表查询(多次查询)

一对一:

-正向查询按字段
-反向查询按表名小写

一对多:

-正向查询按字段(正向查询一定会查出一个来)
-反向查询按表名小写_set.all()(返回结果是queryset对象)

多对多:

-正向查询按字段.all()(正向查询一定会查出多个来)
-反向查询按表名小写_set.all()(返回结果是queryset对象)

基于双下划线的跨表查询

-在filter和values中都可以做连表操作(也就是都可以写 __)
-正向查询按字段
-反向查询按表名小写

无论以谁做基表,没有效率之分

1 查询地址为上海的作者出版的书
# res=Author_det.objects.filter(address='上海').values('author__book__name')
# print(res)
# 2 两种方式
# 查找所有书名里包含红楼的书
# res=Book.objects.filter(name__icontains='eg')
# print(res)
# 查找出版日期是2017年的书
# res=Book.objects.filter(pub_date__year='2017')
# print(res) # 查找出版日期是2017年的书名
# res = Book.objects.filter(pub_date__year='2017').values('name')
# print(res)
# books = Book.objects.filter(pub_date__year='2017')
# for i in books:
# print(i) # 查找价格大于10元的书
# res = Book.objects.filter(price__gt=10)
# print(res) # 查找价格大于10元的书名和价格
# res = Book.objects.filter(price__gt=10).values('name','price')
# print(res)
# books = Book.objects.filter(price__gt=10)
# for i in books:
# print(i.name,i.price) # 查找在北京的出版社
# res = Publisher.objects.filter(addr='北京')
# print(res) # 查找名字以沙河开头的出版社
# res = Publisher.objects.filter(name__startswith='沙河')
# print(res) # 查找作者名字里面带“小”字的作者
# res = Author_sim.objects.filter(name__icontains='小')
# print(res) # 查找年龄大于30岁的作者
# res = Author_sim.objects.filter(age__gt=30)
# print(res) # 查找手机号是155开头的作者
# res = Author_sim.objects.filter(author_det__address__startswith='23')
# print(res) # 查找手机号是155开头的作者的姓名和年龄
# res = Author_sim.objects.filter(author_det__address__startswith='23').values('name','age')
# print(res)
# authors = Author_sim.objects.filter(author_det__address__startswith='23')
# for i in authors:
# print(i.name,i.age) # 查找书名是“红楼梦”的书的出版社
# res = Book.objects.filter(name='红楼梦').values('publisher__name')
# print(res)
# res = Book.objects.filter(name='红楼梦')
# for i in res:
# print(i.publisher) # 查找书名是“红楼梦”的书的出版社所在的城市
# res = Book.objects.filter(name='红楼梦').values('publisher__addr')
# print(res)
# book = Book.objects.filter(name='红楼梦')
# publisher=Publisher.objects.filter(book=book)
# for i in publisher:
# print(i.addr) # 查找书名是“红楼梦”的书的出版社的名称
# res = Book.objects.filter(name='红楼梦').values('publisher__name')
# print(res)
# book = Book.objects.filter(name='红楼梦')
# publisher=Publisher.objects.filter(book=book)
# for i in publisher:
# print(i.name) # 查找书名是“红楼梦”的书的所有作者
# res = Book.objects.filter(name='红楼梦').values('authors__name')
# print(res)
# book = Book.objects.filter(name='红楼梦')
# authors=Author_sim.objects.filter(book=book)
# for i in authors:
# print(i.name) # 查找书名是“红楼梦”的书的作者的年龄
# res = Book.objects.filter(name='红楼梦').values('authors__age')
# print(res)
# book = Book.objects.filter(name='红楼梦')
# authors=Author_sim.objects.filter(book=book)
# for i in authors:
# print(i.age) # 查找书名是“红楼梦”的书的作者的手机号码
# res = Book.objects.filter(name='红楼梦').values('authors__author_det__address')
# print(res)
# book = Book.objects.filter(name='红楼梦')
# authors = Author_sim.objects.filter(book=book)
# for i in authors:
# authors_det = Author_det.objects.filter(author_id=i.id)
# for i in authors_det:
# print(i.address) # 查找书名是“红楼梦”的书的作者的地址
# res = Book.objects.filter(name='红楼梦').values('authors__author_det__address')
# print(res)
# book = Book.objects.filter(name='红楼梦')
# author_sim = Author_sim.objects.filter(book=book)
# for i in author_sim:
# author_det = Author_det.objects.filter(id=i.id)
# for i in author_det:
# print(i.address) # 查找书名是“红楼梦”的书的作者的邮箱
# res = Book.objects.filter(name='红楼梦').values('authors__age')
# print(res)
# book = Book.objects.filter(name='红楼梦')
# author = Author_sim.objects.filter(book=book)
# for i in author:
# print(i.age)

  

TTL

基于对象的跨表查询
-子查询,多条查询
-正向:关联字段在当前表中
-反向:关联不在当前表中
-正向查询:按字段
-反向查询:(具体反向查询按什么字段?默认按这种情况,不建议你修改,related_query_name,写在关联字段上)
-一对一:按表名小写
-一对多:按表名小写_set.all()
-多对多:按表名小写_set.all()

-问题:book.authors.author_detail 这个是错误的
-book.authors.author_detail.all().author_detail 这个是错误的
authors=book.authors.all().
for author in authors:
author.author_detail
-重点:基于对象的跨表查询,必须用表模型的对象查询,不能用queryset对象或者其它的对象
基于双下划线的跨表查找
-正向:按字段
-反向:按表名小写(默认情况下,可以用:related_name来修改,写在关联字段上)
-filter中可以跨表,values中也可以跨表
-练习:查找书名是“红楼梦”的书的出版社的名称
-基于双下划线
-ret=models.Book.objects.filter(name='红楼梦').values('publish__name')
-ret=models.Publish.objects.filter(book__name='红楼梦').values('name')

Python-Django 模型层-多表查询的更多相关文章

  1. 第五章、Django之模型层----多表查询

    目录 第五章.Django之模型层----多表查询 一.一对多字段增删改查 1.增 2.查 3.改 4. 删除 二.多对多的增删改查 1. 增 2. 改 3. 删 三.ORM跨表查询 四.正反向的概念 ...

  2. Python之路【第三十篇】:django 模型层-多表关系

    多表操作 文件为 ---->  orm2 数据库表关系之关联字段与外键约束 一对多Book id title price publish email addr 1 php 100 人民出版社 1 ...

  3. 057.Python前端Django模型ORM多表查询

    一 基于对象的查询 1.1 一对多查询 设计路由 from django.contrib import admin from django.urls import path from app01 im ...

  4. Django模型层-单表操作

    ORM介绍 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...

  5. Django之django模型层一单表操作

    一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...

  6. Django 模型层--单表

    ORM  简介 MTV或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这可以大大的减少了开 ...

  7. Django模型层-多表操作

    多表操作 一.创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是 ...

  8. 5.Django|模型层--多表关系

    多表操作 文件为 ---->  orm2 数据库表关系之关联字段与外键约束 一对多Book id title price publish email addr php 人民出版社 北京 pyth ...

  9. Python-Django 模型层-单表查询

    单表操作 -增加,删,改:两种方式:queryset对象的方法,book对象的方法 -改:需要用save() -get()方法:查询的数据有且只有一条,如果多,少,都抛异常 单表查询 -<1&g ...

随机推荐

  1. Asp.Net Core使用NLog+Mysql的几个小问题

    项目中使用NLog记录日志,很好用,之前一直放在文本文件中,准备放到db中,方便查询. 项目使用了Mysql,所以日志也放到Mysql上,安装NLog不用说,接着你需要安装Mysql.Data安装包: ...

  2. [Alpha阶段]第二次Scrum Meeting

    Scrum Meeting博客目录 [Alpha阶段]第二次Scrum Meeting 基本信息 名称 时间 地点 时长 第二次Scrum Meeting 19/04/04 大运村寝室6楼 90min ...

  3. 微信小程序手机预览请求不到数据(最后一条不明所以)

    本地开发调试小程序时,用手机预览需要有如下设置:1.微信开发者工具中设置:不校验安全域名.web-view 域名.TLS 版本以及 HTTPS 证书.这样在有网络请求的时候,就可以访问本地的服务器了, ...

  4. Python如何将整数转化成二进制字符串

    Python 如何将整数转化成二进制字符串 1.你可以自己写函数采用 %2 的方式来算. >>> binary = lambda n: '' if n==0 else binary( ...

  5. Nginx 11阶段的顺序处理

    L49

  6. LoadRunner【第一篇】下载、安装、破解

    loadrunner11下载 loadrunner11大小有4g多,相对另外一款开源的性能测试工具jmeter来说,是非常笨重的了,网上很多,大家可以搜索,也可以点击右侧加群获取安装包. loadru ...

  7. django系列4 :创建管理员

    以下复制粘贴自官网 创建管理员用户¶ 首先,我们需要创建一个可以登录管理站点的用户.运行以下命令: /  $ python manage.py createsuperuser 输入所需的用户名, ...

  8. Python之路(第十七篇)logging模块

    一.logging模块 (一).日志相关概念 日志是一种可以追踪某些软件运行时所发生事件的方法.软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情.一个事件可以用一个可包含可选变 ...

  9. 美化博客CSS

    title: 美化博客CSS date: 2019/01/19 14:28:59 --- 美化博客CSS 可以去这里看下好看的样式 修改下文档的css,博客园是在页面定制CSS代码,我这里修改了下标题 ...

  10. Fiddler--AutoResponder

    AutoResponder支持创建规则,可以在响应请求时自动触发,常见例子是返回之前捕捉的响应,而不需要访问服务器. 通俗点讲,就是它能在不访问服务器的情况下,使发送的请求得到自己设置的响应. 下图是 ...