表结构

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正向和反向查询的更多相关文章

  1. (19)模型层 -ORM之msql 跨表查询(正向和反向查询)

    基于对象的跨表查询 基于对象的跨表查询'''正向和反向查询'''# 正向 ----> 关联字段在当前表中,从当前表向外查叫正向# 反向 ---> 关联字段不在当前表中,当当前表向外查叫反向 ...

  2. ORM查询之基于对象的正向查询与反向查询

    一.为什么有正向查询和反向查询? 举例有两张表,一张表叫书籍表,一张表叫出版社表,他们关系是一对多的关系,书籍是多,出版社是一,因为一本书应该只有一个出版社对应,而出版社可以有多本书对应. 那么在实际 ...

  3. ORM 创建manytomay的三种方法 反向查询 和一些 双下方法版学员管理系统3

    老师信息管理   三种创建多对对外键的方式常用第二种和第三种 思考 三种方式创建多对多外键方式及其优缺点. 外键的查询和使用 1外键的创建: 在数据库表中的表现形式 如何连表查询和使用 表里边:  s ...

  4. 【mybatis】mybatis 查询mysql 长编码的查询使用 正向查询和反向查询,避免数据库关系 递归查询的 解决方案

    长编码存储规则为: 父级长编码+":"+自己的uid 例如最顶级GoodsType-->uid = 123  --->longCode= 123: 子级GoodsTyp ...

  5. django ORM model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct

    版权归作者所有,任何形式转载请联系作者.作者:petanne(来自豆瓣)来源:https://www.douban.com/note/301166150/ 1.多表连接查询:感觉django太NX了. ...

  6. Django ORM 反向查询

    一/一对多反向查询   先定义两个模型,一个是A,一个是B,是一对多的类型. class A(models.Model): name= models.CharField('名称', max_lengt ...

  7. ORM 多表操作查询及增删改查

    ------------------------------------------只有对前途乐观的人,才能不怕黑暗,才能有力量去创造光明.乐观不是目的,而是人生旅途中的一种态度. 多表操作 创建模型 ...

  8. ORM的多表查询详述

    ORM的多表查询 ORM最核心与用的最多的地方就是跨表查询了.这里的"跨表查询"分为以下几种:基于对象的跨表查询.基于双下划线的跨表查询.聚合查询.F与Q查询以及分组查询. 下面就 ...

  9. 10 ORM 多表操作 查询

    1.子查询:基于对象的跨表查询 def query(request): """ 跨表查询: 1.基于对象查询 2.基于双下划线查询 3.聚合.分组查询 4. F Q 查询 ...

随机推荐

  1. 解决无法安装Flash Player的问题

    1.同时搜索几个关键词:关键词用空格分开,例如:“中国 历史”会搜索显示同时包含中国.历史两个词的网页 2.排除某个关键词:被排除的词前面加上-号,例如“中国 历史 -清朝”会把有清朝两个字的网页过滤 ...

  2. python 进程池pool简单使用

    平常会经常用到多进程,可以用进程池pool来进行自动控制进程,下面介绍一下pool的简单使用. 需要主动是,在Windows上要想使用进程模块,就必须把有关进程的代码写if __name__ == ‘ ...

  3. orocos_kdl学习(一):坐标系变换

    KDL中提供了点(point).坐标系(frame).刚体速度(twist),以及6维力/力矩(wrench)等基本几何元素,具体可以参考 Geometric primitives 文档. Creat ...

  4. python3用BeautifulSoup抓取a标签

    # -*- coding:utf-8 -*- #python 2.7 #XiaoDeng #http://tieba.baidu.com/p/2460150866 from bs4 import Be ...

  5. 团队工作效率分析工具gitstats

    如果你是团队领导,关心团队的开发效率和工作激情:如果你是开源软件开发者,维护者某个repo:又或者,你关心某个开源软件的开发进度,那么你可以试一试gitstats. gitstats 是一个git仓库 ...

  6. iBatis resultMap报错 nullValue完美解决

    http://blog.csdn.net/liguohuaty/article/details/4038437

  7. 有关volatile关键字和transient关键字

    (1)volatile关键字['vɑlətl]的作用 让变量每次在使用的时候,都从主存中取,而不是从各个线程的“工作内存”. 也就是说,volatile变量对于每次使用,线程都能得到当前volatil ...

  8. SNF开发平台WinForm-Grid表格控件大全

    我们在开发系统时,会有很多种控件进行展示,甚至有一些为了方便的一些特殊需求. 那么下面就介绍一些我们在表格控件里常用的方便的控件:   1.Grid表格查询条 Grid表格下拉 3.Grid表格弹框选 ...

  9. 开源配置管理平台-Apollo

    Apollo(阿波罗)是携程框架部门研发的配置管理平台,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端. Apollo官网地址

  10. 运行第一个Docker容器-Docker for Web Developers(1)

    1. Docker介绍 Docker由dotCloud公司发起的一个内部项目,后来Docker火了,dotCloud公司改名为Docker了: Docker使用了Go语言开发,基于 Linux 内核的 ...