前面篇随笔写的是基于对象的跨表查询:对象.objects.filter(。。。) 对象.关联对象_set.all(...) -->反向
基于对象的跨表查询例如:
book_obj= Book.objects.filter(id=4).first() #注意多了个first
print(book_obj) #go 这里得到的是一个models对象
print(book_obj.publish.name) #桔子出版社
这篇随笔主要写的是基于双下划线的跨表查询,其本质是使用join连接其他表进行查询
一对多
def query(request):
#正向查询
ret1=Book.objects.filter(title='西游记').values("publish__name")
print(ret1) #<QuerySet [{'publish__name': '榴莲出版社'}]>
print(ret1.first(),type(ret1.first())) #{'publish__name': '榴莲出版社'} <class 'dict'> 注意key 为 publish__name
print(ret1.first()['publish__name']) # 榴莲出版社 #反向查询
ret2=Publish.objects.filter(book__title="西游记").values('name') #这里的book是表名称,book表里面有字段 title
print('---------------------------------')
print(ret2) #<QuerySet [{'name': '榴莲出版社'}]>
print(ret2.first()['name'])#榴莲出版社
return HttpResponse('ok')
多对多
#查询python书的作者的名字和年龄
def query(request):
#正向查询
ret = Book.objects.filter(title="python").values("authors__name","authors__age")
print(ret) #注意结果的key
#结果 <QuerySet [{'authors__name': 'wang', 'authors__age': 27}, {'authors__name': 'xiao', 'authors__age': 25}, {'authors__name': 'zhang', 'authors__age': 26}]> #反向查询
ret = Author.objects.filter(book__title="python").values("name","age")
print(ret) #区分正向查询的key
#结果 <QuerySet [{'name': 'wang', 'age': 27}, {'name': 'xiao', 'age': 25}, {'name': 'zhang', 'age': 26}]>
return HttpResponse('ok')
一对一
例子:查询名字为 xiao 的gf是什么
def query(request):
#正向查询
ret=Author.objects.filter(name='xiao').values('ad__gf') #Author设置了外键到 AuthorDetail
print(ret) #<QuerySet [{'ad__gf': '刘诗诗'}]> #反向查询
ret=AuthorDetail.objects.filter(author__name='xiao').values('gf')
print(ret) #<QuerySet [{'gf': '刘诗诗'}]> return HttpResponse('ok')
下面进行跨多表查询,涉及三个表或者以上
#查询西瓜出版社出版过的书籍和书籍作者的名字
def query(request):
#正向
ret=Book.objects.filter(publish__name="西瓜出版社").values_list("title",'authors__name') print(ret)
#<QuerySet [('三国演义', 'zhang'), ('python', 'xiao'), ('python', 'zhang'), ('python', 'wang')]> #反向
ret = Publish.objects.filter(name="西瓜出版社").values_list("book__title","book__authors__age","book__authors__name") print(ret)
#<QuerySet [('三国演义', 26, 'zhang'), ('python', 25, 'xiao'), ('python', 26, 'zhang'), ('python', 27, 'wang')]>
return HttpResponse('ok')
手机号以11开头的作者出版过的所有书籍名称以及出版社名称
def query(request):
#正向
ret = Book.objects.filter(authors__ad__tel__startswith="11").values("title","publish__name")
print(ret)
#< QuerySet[{'title': 'python', 'publish__name': '西瓜出版社'}, {'title': '三国演义', 'publish__name': '西瓜出版社'}] >
#反向
ret = Author.objects.filter(ad__tel__startswith="11").values("book__title","book__publish__name")
print(ret)
#<QuerySet [{'book__title': '三国演义', 'book__publish__name': '西瓜出版社'}, {'book__title': 'python', 'book__publish__name': '西瓜出版社'}]>
return HttpResponse('查询成功')
django之 基于queryset和双下划线的跨表查询的更多相关文章
-
{django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...
-
Django基础(5) ----基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询
一.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接模型(mode ...
-
Django框架(九)-- 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询
一.创建多表模型 一对一:OneToOneField 一对多:ForeignKey 多对多:ManyToManyField 创建表时,会自动添加一个nid字段,并且自增,所以id可以不用手动创建 On ...
-
django orm 基于双下划线的跨表查询
一..基于双下划线的跨表查询(join实现) key:正向查询按字段,反向查询按表明小写 1.一对多跨表查询 查询在跨表中可以有两种方式,正向查询就是关键字段在你要搜索的表,没有关键字段就是反向查询 ...
-
Django框架(十)—— 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询
目录 多表操作:增删改,基于对象/双下划线的跨表查询.聚合查询.分组查询.F查询与Q查询 一.创建多表模型 二.一对多增删改表记录 1.一对多添加记录 2.一对多删除记录 3.一对多修改记录 三.一对 ...
-
Django Mysql数据库-基于双下划线的跨表查询
一.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接模型(mode ...
-
python 全栈开发,Day74(基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询)
昨日内容回顾 # 一对多的添加方式1(推荐) # book=Book.objects.create(title="水浒传",price=100,pub_date="164 ...
-
(转)python 全栈开发,Day74(基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询)
昨日内容回顾 # 一对多的添加方式1(推荐) # book=Book.objects.create(title="水浒传",price=100,pub_date="164 ...
-
django基础之day04,必知必会13条,双下划线查询,字段增删改查,对象的跨表查询,双下划线的跨表查询
from django.test import TestCase # Create your tests here. import os import sys if __name__ == " ...
随机推荐
-
Windows添加在此处打开命令CMD
打开rededit在:HKEY_CLASS_ROOT > * > shell >下面新建一个项CMD 在CMD中新建两个字符串 一个是默认,值为 @shell32.dll,- 另外一 ...
-
使用原生JS定位网页元素
约定:1.<meta name="viewport" content="width=device-width">这种标记简称"wdw&qu ...
-
软件工程实践助教每周小结 <; 福州大学 | 傅明建 >;
第一周助教小结 1. 助教博客链接: http://www.cnblogs.com/sinceway/ 2. 本周点评的作业数量:约22份,有多次交互 3. 本周点评有困难的作业链接: https:/ ...
-
Git使用详细教程(7):.gitignore使用详解
Git提供了一个.gitignore文件,帮助我们忽略掉一些不想或者不能提交到版本控制器中的文件.这个文件的使用时必须要掌握的. *.a # 忽略所有目录下的.a结尾的文件 !lib.a # 但lib ...
-
windows Apache 环境下配置支持HTTPS的SSL证书
windows Apache 环境下配置支持HTTPS的SSL证书 1.准备工作 1)在设置Apache + SSL之前, 需要做: 安装Apache, 下载安装Apache时请下载带有SSL版本的A ...
-
两台计算机有相同的IP地址会发生什么情况?两台计算机有相同的MAC地址会发生什么情况?
1 相同IP a) 同一网段内 会发生IP地址冲突.两台主机在特定情况下是可以同时使用同一个IP地址的.但是如果这两台主机在同一个网络内,大多数情况下,二者或者其中之一的连通性将会被破坏.比方 ...
-
HDU 1513 &;&; POJ 1159 Palindrome (DP+LCS+滚动数组)
题意:给定一个字符串,让你把它变成回文串,求添加最少的字符数. 析:动态规划是很明显的,就是没有了现思路,还是问的别人才知道,哦,原来要么写,既然是回文串, 那么最后正反都得是一样的,所以我们就正反求 ...
-
(转)Jupyter notebook入门教程(上,下)
https://blog.csdn.net/red_stone1/article/details/72858962------上 https://blog.csdn.net/red_stone1/ar ...
-
VC++ 在两个程序中 传送字符串等常量值的方法:使用了 WM_COPYDATA 消息(转载)
转载:http://www.cnblogs.com/renyuan/p/5037536.html VC++ 在两个程序中 传递字符串等常量值的方法:使用了 WM_COPYDATA 消息的 消息作用: ...
-
【算法乱讲】BSGS
Description Given a prime P, 2 <= P < 231, an integer B, 2 <= B < P, and an integer N, 1 ...