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 查询 ...
随机推荐
- redis简记
redis学习笔记 http://doc.redisfans.com/ 键空间通知(keyspace notification) 键空间通知,客户端可以通过订阅频道或者模式来接收redis改动的数据集 ...
- Redis深入之对象
Redis对象系统 前面介绍了Redis用到的全部主要数据结构,如简单动态字符串(SDS).双端链表.字典.压缩列表.整数集合等 Redis并没有直接使用这些数据结构来实现键值对数据库.而是基于这些数 ...
- Linux-文件描述符的本质及与文件指针的区别
文章参考:文件描述符的本质.文件描述符和文件指针的区别.文件描述符fd和文件指针flip的理解 推荐:task_struct 和文件系统的关系 系统中文件相关表 右侧的表称为i节点表,在整个系统中只有 ...
- Adobe Illustrator for Mac(矢量图处理软件)破解版安装
1.软件简介 Adobe Illustrator CC 是 macOS 系统上一款矢量绘图工具,可以说是是业界标准矢量绘图标杆,软件通过形状.色彩.效果及印刷样式,展现您的创意想法.在处理大型复 ...
- 【Java】数组不能通过toString方法转为字符串
java里,所有的类,不管是java库里面的类,或者是你自己创建的类,全部是从object这个类继承的.object里有一个方法就是toString(),那么所有的类创建的时候,都有一个toStrin ...
- Background Media Recovery terminated with ORA-1274 after adding a Datafile (Doc ID 739618.1)
APPLIES TO: Oracle Database - Enterprise Edition - Version 9.2.0.1 to 12.1.0.2 [Release 9.2 to 12.1] ...
- Windows Media Player 的文件格式支持情况
唔,官方文档:https://support.microsoft.com/zh-cn/help/316992/file-types-supported-by-windows-media-player ...
- R绘制3D散点图
目前主要使用ggplot2做一些数据可视化的分析,但是ggplot2有个很大的缺陷是不支持3D作图,所以需要查找其他替代方案. 下面找到的两个替代方案不错,亲测可行,记录于此. 交互3D librar ...
- [svc]通过bridge连接单机的多个网络namespace
ip操作物理网卡 参考: http://www.cnblogs.com/iiiiher/p/8056930.html - 查看mac/操作物理网卡 ip link - 查看ip/mac ip a - ...
- Java和Scala语法比较
类型推断 挑逗指数: 四星 我们知道,Scala一向以强大的类型推断闻名于世.很多时候,我们无须关心Scala类型推断系统的存在,因为很多时候它推断的结果跟直觉是一致的. Java在2016 年也新增 ...