跨表查询_defu7141的博客-程序员秘密

技术标签: python  

跨表查询

一、ORM 跨表查询

class Book(models.Model):

title = models.CharField(max_length=32)

publish = models.ForeignKey(to="Publish",to_field="id",on_delete=models.CASCADE)

authors = models.ManyToManyField(to = "Author",related_name='bookList')



class Publish(models.Model):

name = models.CharField(max_length=32)



class Author(models.Model):

name = models.CharField(max_length=32)

ad = models.OneToOneField("AuthorDetail",on_delete=models.CASCADE)



class AuthorDetail(models.Model):

telephone = models.BigIntegerField()

  

1、基于对象查询(sql:子查询):

一对多、(Publish--Book)

正向查询,按字段:

查询python这本书的出版社所在名称

book_obj = Book.objects.filter(title="python").first()

print(book_obj.publish.name)

反向查询,按表明小写_set:

人民出版社出版过的所有书籍名称

publish_obj = Publish.objects.filter(name="人民出版社出版").first()

print(publish_obj.book_set.all())

for obj in publish_obj.book_set.all():

print(obj.title)	书名逐一显示

  

 

多对多、

正向查询,按字段:

python这本书所有作者的名字

book_obj = Book.objects.filter(title="python").first()

book_obj.authors.all()

反向查询,按表明小写_set:

alex出版过的所有书籍名称

alex = Author.objects.filter(name="alex").first()

方法一:alex.book_set.all()

方法二(这是设置related_name='bookList'方法):alex.bookList.all()

  

一对一、

正向查询,按字段:

查询alex的手机号

alex = Author.objects.filter(name="alex").first()

alex.ad.telephone

反向查询,按表明小写:

以151开头的手机号的作者的名字

ad = AuthorDetail.objects.get(telephone__startswith="151")

ad.authour.name

  

2、基于Queryset和__(sql:join语句):

正向查询,按字段

反向查询,按表明小写


一对多、(Publish--Book)

正向查询,按字段:

查询python这本书的出版社所在名称

Book.objects.filter(title="python").values("publish__name")

for obj in Book.objects.filter(title="python"):

temp={}

temp["publish__name"] = obj.publish.name


反向查询,按表明小写:

人民出版社出版过的所有书籍名称

Publish.objects.filter(name="人民出版社出版").values("book__title")

 

 

多对多、

python这本书所有作者的名字

Book.objects.filter(title="python").values("authors__name")

 

alex出版过的所有书籍名称

Author.objects.filter(name="alex").values("book__title")
一对一、
正向查询,按字段:

查询alex的手机号

Author.objects.filter(name="alex").values("ad__telephone")

 

以151开头的手机号的作者的名字

AuthorDetail.objects.filter(telephone__startswith="151").values("author__name")  

 

三、拓展

eg1:
查询python这本书的出版社所在名称

Book.objects.filter(title="python").values("publish__name")

Publish.objects.filter(book__title="python").values("name")

eg2:
以151开头的手机号的作者的名字

AuthorDetail.objects.filter(telephone__startswith="151").values("author__name")

Book.objects.filter(authors__ad__telephone__startswith="151").values("title","publish__name")

  

 

转载于:https://www.cnblogs.com/mainstream/p/11113410.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/defu7141/article/details/102420019

智能推荐

网站性能优化--实例分析篇_JeamKing的博客-程序员秘密

转自:http://blog.sina.com.cn/s/blog_466c66400100bkis.html--提升性能的同时为你节约10倍以上成本From: http://blog.sina.com.cn/iyangjian一,自选股分析二,NBA比赛分析三,播客分析四,开心网分析-----------------------------------------

左耳听风ARTS分享第1周_左耳听风 笔记_hyqapple的博客-程序员秘密

左耳听风ARTS分享第1周AlgorithmReviewTipshareAlgorithm两数之和给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。var twoSum = function(nums, target) { v...

JavaScript-06_T_Donna的博客-程序员秘密

JavaScript学习笔记-06JavaScript-061 - 内置对象1.1 内置对象1.2 查文档1.3 Math对象1.4 日期对象 ***1.5 数组对象创建数组的两种方式检测是否为数组 ***添加删除数组元素的方法数组排序数组索引方法数组转换为字符串其他方法1.6 字符串对象基本包装类型字符串的不可变根据字符返回位置根据位置返回字符字符串操作方法replace()方法split()方法2 - 简单数据类型和复杂数据类型2.1 简单数据类型2.2 复杂数据类型2.3 堆栈2.4 简单类型传参

LZ78 压缩算法的 Java 实现_简简单单OnlineZuozuo的博客-程序员秘密

文章目录LZ78 压缩算法的 Java 实现1、压缩算法的实现2、解压缩算法的实现3、测试和使用4、Python 版本的实现代码LZ78 压缩算法的 Java 实现1、压缩算法的实现通过多路搜索树提高检索速度package com.wretchant.lz78;import java.util.*;/** 多路英文单词查找树 */class Trie { private TrieNode root; public Trie() { root = ne

训练集和测试集类别特征值不同的处理_测试集中的类别训练集没有_lizz2276的博客-程序员秘密

1、one-hot编码怎么让测试集的类别与训练集的类别在数量上一致呢?https://www.zhihu.com/question/314941339one-hot编码怎么让测试集的类别与训练集的类别在数量上一致呢?我的训练集在one-hot编码后有4449个特征,而在测试集中有4109个特征,所以训练后的网络不能用在测试集中,不知道应该如何更改,希望大家帮助,谢谢!关注者6被浏览926关注问题​写回答​邀请回答​添加评论​分享​收起 ​4 个回答默认排序VinerLVine

Block的使用 iphone_ToddFox的博客-程序员秘密

from: http://www.cocoachina.com/newbie/basic/2012/0514/4247.html本文主要是阐述一下Block中如何的使用外部变量以及block本身的内存管理。 先定义一个block变量,作为后续的例子中使用: typedef void(^BlockCC)(void); BlockCC _block;

随便推点

TeX (Extract)_ensoo的博客-程序员秘密

TeX开放分类: 计算机、字处理、排版软件 【名称】:TeX【中文释义】:基于宏的流行的文本格式化程序 (它是包括LaTeX和teTeX在内的其它此类格式化程序的基础) 【概述】    电子排版系统的出现给印刷出版业带来了一场革命,利用电子计算机及各种辅助设备,可以完成从文稿、图表的录入、编辑、修改

编程之美之字符串移位包含的问题_字符串移位包含问题c语言_luckyu1的博客-程序员秘密

s2出现在s1经过移位得到的字符串中充要条件是s2出现在S1S1中自己写几个样例就很容易理解了

Ubuntu18.04+opencv 3.4.1安装及测试报错No package libjasper-de CMake Error: nvcc fata 编译2.7->3.6_rrr2的博客-程序员秘密

下载opencv.zip要提前安装依赖项。先更新一下下载源。用17.04 的源可以解决在18.04中找不到libjasper.dev的问题。refhttps://stackoverflow.com/questions/43484357/opencv-in-ubuntu-17-04libjasper-dev无法安装errorE: unable to locate libjasper-de...

推测用户行为 程序员分享Android开发经验(转载)_手机用户行为预测开源方案_davyxie的博客-程序员秘密

<br />转载于http://mobile.csdn.net/n/20101104/281380.html<br /> <br /> <br />2010-11-04 09:14 | 1549次阅读 | 来源:20ju.com  【已有6条评论】发表评论<br />关键词:Android | 收藏这篇资讯<br /><br />pre { white-space: pre-wrap; font-size: 14px; line-height: 24px; }* html

Python创始人为什么叫“龟叔”?_为什么叫龟叔_IT技术学习的博客-程序员秘密

因为 吉多·范罗苏姆(Guido van Rossum)中的Guido(吉多),拼音(哥威龟)Gui龟,所以被中国程序员戏称为“龟叔”。网上查了查,关于这个问题的资料比较少,大家怎么看这种观点,欢迎在评论区留言~~~...

微软张若非:搜索引擎和广告系统,那些你所不知的AI落地技术_AI科技大本营的博客-程序员秘密

【12月公开课预告】,入群直接获取报名地址12月11日晚8点直播主题:人工智能消化道病理辅助诊断平台——从方法到落地12月12日晚8点直播:利用容器技术打造AI公司技术中台12月17日晚...

推荐文章

热门文章

相关标签