django中的跨表查询梳理
1.前言
最近在写一个小项目,里面主要涉及的就是表与表之间复杂的关系。当真正开发起来的时候,才发现自己对复杂的表关系间的查询有点混乱,趁着这几天的时间,重新梳理了一下。
2.概念
在开始之前,先明确几个基础概念:
正向查询:关联字段所在的表查询其关联表叫正向查询
反向查询:未写关联字段的表查询其关联表叫反向查询
# 书籍表
class Book(models.Model):
name = models.CharField(max_length=32)
publish = models.ForeignKey(to='Publish')
def __str__(self):
return self.t_name
# 出版社表
class Publish(models.Model):
name = models.CharField(max_length=32)
def __str__(self):
return self.t_name
# 根据书籍表,查询其出版社,叫正向查询
# 根据出版社,查询书籍,叫反向查询
3.一对多
正向查询(按字段)
book_obj=Book.objects.filter(pk=1).first() # 拿到书籍为1对对象
publish_name = book_obj.publish.name # 根据字段查询
反向查询(按表名)
# 查询a出版社出版的书籍
book_list = Publish.book_set.all() # queryset对象
4.多对多
正向查询(按字段)
author_list = Book.objects.filter(pk=1).first().author.all()
# 多对多的关系,一本书查出来的作者可能是多个,所以一定是一个queryset对象
反向查询(按表名)
Author.objects.filter(pk=1).first().book_set.all()
# 多对多的关系,一作者查出来的书可能是多本,所以一定是一个queryset对象
注意:在ForeignKey()和ManyToManyField()可以设置related_name的值来赋值FOO_set
class Book(model.Model):
publish = ForeignKey(Book, related_name='bookList')
# 查询
Publish.objects.filter(pk=1).first().bookList.all()
5.基于双下划线的查询
django还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认SQL JOIN 联系。要做跨关系查询,就使用两个下划线来链接模型(model)间关联字段的名称,直到最终链接到你想要的model 为止,同样的,正向查询按字段,反向查询按表名小写。
一对多
# 查询a出版社出版的书的名字(name)和数量(num) 正向查询,按字段
Book.objects.filter(publish__name='a出版社').values_list('naem','num')
# 查询a出版社出版的书的名字(name)和数量(num) 反向查询,按字段
Publish.objects.filter(name='a出版社').
values_lsit('book__name','book_num')
# 其实本质是一样的,就是sql语句的select from的表不同而已
多对多
# 查询a作者的书的名字(name)和数量(num) 正向查询,按字段
Book.objects.filter(author__name='a').values_list('naem','num')
# 查询a出版社出版的书的名字(name)和数量(num) 反向查询,按字段
Author.objects.filter(name='a').
values_lsit('book__name','book_num')
6.分组查询
annotate()为调用QuerySet中每一个对象都生成一个独立的统计值,本质就是将关联的表用sql语句中的join成一张表,再按单表查询的方法进行操作。
7.django中的F查询和Q查询
在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较。而现实的需求中往往会有两个字段的值做比较这样的需求,django给我们提供了这两种查询方法。
F()
# 查询评论数大于收藏数的书籍
from django.db.models import F
Book.objects.filter(commnetNum__lt=F('keepNum'))
# 将每本书的价格提高30
Book.objects.all().update(price=F("price")+30)
Q()
bookList=Book.objects.filter(Q(author__name="a")|Q(author__name="b"))
8.总结
数据的操作,往往是项目中的关键一步,理清楚数据间的关系和查询方法,更有助于程序的开发。
django中的跨表查询梳理的更多相关文章
- Django中的跨表查询,多表查询。
一:Django中的ORM进行操作. 必须掌握的十三条: <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 & ...
- django中orm多表查询,减少数据库查询操作
.select_related() 的使用
- django之 使用views.py里面的函数对表进行增删改查 内容(models.py中表的创建、views.py中函数的使用,基于对象的跨表查询)
models之对于表的创建有以下几种: 一对一:ForeignKey("Author",unique=True), OneToOneField("Author" ...
- django(3) 一对多跨表查询、ajax、多对多
1.一对多跨表查询获取数据的三种形式:对象.字典.元组 例:有host与business两张表,host与business的id字段关联,business在host表中的对象名是b, 通过查询hos ...
- django models的点查询/跨表查询/双下划线查询
django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...
- django之跨表查询及添加记录
一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many); 一本书只应该由一个出版商出 ...
- python 全栈开发,Day73(django多表添加,基于对象的跨表查询)
昨日内容回顾 多表方案: 如何确定表关系呢? 表关系是在2张表之间建立的,没有超过2个表的情况. 那么相互之间有2条关系线,先来判断一对多的关系. 如果其中一张表的记录能够对应另外一张表的多条记录,那 ...
- {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...
- Django框架----跨表查询及添加记录
一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many); 一本书只应该由一个出版商出 ...
随机推荐
- RabbitMQ 消息确认机制以及lazy queue+ disk消息持久化
一:Basic的一些属性,一些方法 1. 消费端的确认 自动确认: message出队列的时候就自动确认[broke] basicget... 手工确认: message出队列之后,要应用程序自己去确 ...
- James Munkres Topology: Sec 22 Exer 6
Exercise 22.6 Recall that \(\mathbb{R}_{K}\) denotes the real line in the \(K\)-topology. Let \(Y\) ...
- 《团队作业》五小福团队作业--UNO-- LandingDay--降落
<团队作业>五小福团队作业--UNO-- LandingDay--降落 写在前面 几周的飞行之后,降落之日也如期而至了.在2018年12月19日我们顺利地完成了项目的总结汇报.但是,短暂的 ...
- C++ 初读迭代器
迭代器 这是个啥? string对象或vector对象可以通过下标访问每一个元素,迭代器也具有同样的效果.那又有什么不同呢?事实上并不是所有的容器到可以使用下标访问每一个元素,即在容器上迭代器更具普适 ...
- Python数据模型及Pythonic编程
Python作为一种多范式语言,它的很多语言特性都能从其他语言上找到参照,但是Python依然形成了一套自己的“Python 风格”(Pythonic).这种Pythonic风格完全体现在 Pytho ...
- Rectangular Covering [POJ2836] [状压DP]
题意 平面上有 n (2 ≤ n ≤ 15) 个点,现用平行于坐标轴的矩形去覆盖所有点,每个矩形至少盖两个点,矩形面积不可为0,求这些矩形的最小面积. Input The input consists ...
- 使用curl上传图片的方法
关键:当参数名为"@绝对路径",这时 CURL 會幫你做 multipart/form-data 編碼 实现方法: $params = array( 'file' => '@ ...
- 如何使用$.each()与$().each()以及他们的区别
1.首先,说下$.each(Arry/Object,function(index,val){ //index表示下标,val表示下标对应的值 }) 下面是使用$.each()的几种类型,其中arr2与 ...
- idea构建spring源码阅读环境
注:由于文章不是一次性完成,下文中的test1目录和test目录应为同一个目录. (一)安装git和Gradle Spring项目托管在github之上,基于Gradle来构建项目.所以要想搭建Spr ...
- WinForm的.Designer.cs代码内抛反射异常
今天在项目内一个Winform增加控件后,无法打开,抛如下异常. System.Reflection.TargetInvocationException: Exception has been thr ...