Django models对象的select_related方法(减少查询次数)
表结构
先创建一个新的app
python manage.py startapp test01
在settings.py注册一下app
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'test01',
)
models.py
from django.db import models
class Person(models.Model):
name = models.CharField('作者姓名', max_length=10)
age = models.IntegerField('作者年龄')
class Book(models.Model):
person = models.ForeignKey(Person, related_name='person_book')
title = models.CharField('书籍名称', max_length=10)
pubtime = models.DateField('出版时间')
执行如下2条语句初始化表结构
python manage.py makemigrations
python manage.py migrate
两张表关系说明:
一个人员表,一个书名表,人员有字段name和age,书名表的人员和人员表外键关联,即一本书的作者只能有一个,一个作者可以有多本书
打开sql执行过程日志到console中
# 通过此方法可以看到django ORM的详细执行过程
# 在项目的settings.py中添加如下内容
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
}
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'level': 'DEBUG',
},
}
}
然后就通过数据库或者admin随便插入几条数据吧,admin这里就不赘述了
在console里测试一下效果吧
# 先看看不用select_related的效果,通过书来找到书作者的名字,子表找母表的一个字段
>>> b=models.Book.objects.get(id=1)
(0.000) QUERY = u'SELECT "test01_book"."id", "test01_book"."person_id", "test01_book"."title", "test01_book"."pubtime" FROM "test01_book" WHERE "test01_book"."id" = %s' - PARAMS = (1,); args=(1,)
>>> print b.person.name
王八
(0.000) QUERY = u'SELECT "test01_person"."id", "test01_person"."name", "test01_person"."age" FROM "test01_person" WHERE "test01_person"."id" = %s' - PARAMS = (1,); args=(1,)
# 效果就是查询了2次数据库
# 再来看看用了select_related的效果
>>> b=models.Book.objects.select_related().get(id=1)
(0.000) QUERY = u'SELECT "test01_book"."id", "test01_book"."person_id", "test01_book"."title", "test01_book"."pubtime", "test01_person"."id", "test01_person"."name", "test01_person"."age" FROM "test01_book" INNER JOIN "test01_person" ON ( "test01_book"."person_id" = "test01_person"."id" ) WHERE "test01_book"."id" = %s' - PARAMS = (1,); args=(1,)
>>> print b.person.name
王八
# 只查询了一次数据库,当然会提高性能,orm在第一次拿出book对象的时候,就顺道把他关联的表的信息拿到了,所以第二次就不用再重新查询了,类似一个信息的缓存,同理一对一关联也可以这么做
# select_related()可以接一个参数,比如book这张表除了person还有public一个字段也是外键,那么可以在()内指定'person',即可只取到person关联的,即如下3行,最后执行的sql是不同的,以免获取到大量不用的信息浪费性能
b = models.Book.objects.select_related().get(id=1)
In[4]: b = models.Book.objects.select_related('public').get(id=1)
In[5]: b = models.Book.objects.select_related('person').get(id=1)
Django models对象的select_related方法(减少查询次数)的更多相关文章
- 遍历一个二维数组的简便方法(减少foreach次数)
在一些特定场合可以使用下, 还是有局限性 输出结果 : 另一种场景 : 输出结果 : 更复杂的场景 : 输出结果 :
- Django 中的select_related函数优化查询
参考链接: https://blog.csdn.net/secretx/article/details/43964607 在数据库有外键的时候,使用select_related()和prefech_r ...
- django models的点查询/跨表查询/双下划线查询
django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...
- Django——8 关系表的数据操作 表关联对象的访问 多表查询
Django 关系表中的数据操作 表关联对象的访问 关联对象的add方法 create方法 remove方法 clear方法 多表查询 查询补充 聚合查询 分组查询 F查询 Q查询 关系表的数据操作 ...
- Django models 单表查询
从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet 1. 查看Django QuerySet执行的SQL .query.__str__()或 .query属性打印执行的sql语句 ...
- Django(九)模型:dj查询数据库的函数(方法)
一.查询函数 通过模型类.objects属性可以调用如下函数,实现对模型类对应的数据表的查询. 函数表 函数名 功能 返回值 说明 get 返回表中满足条件的一条且只能有一条数据. 返回值是一个模型类 ...
- Django models .all .values .values_list 几种数据查询结果的对比
Django models .all .values .values_list 几种数据查询结果的对比
- 关于Hibernate查询对象调用set方法自动同步到数据库解决方案
Hibernate的get和load方法查询出的实体都是持久化对象,拿到该对象后,如果你调用了该对象的set方法,如果再同一个事务里面,那么在事务递交的时候,Hibernate会把你设置的值自动更新到 ...
- Django Models随机获取指定数量数据方法
方法一:新增models的Manager方法 下面就直接发代码了 class RandomManager(models.Manager): def get_queryset(self): return ...
随机推荐
- Atitit 项目语言的选择 java c#.net php??
Atitit 项目语言的选择 java c#.net php?? 1.1. 编程语言与技术,应该使用开放式的目前流行的语言趋势1 1.2. 从个人职业生涯考虑,java优先1 1.3. 从项目实际来 ...
- 前端性能优化的另一种方式——HTTP2.0
最近在读一本书叫<web性能权威指南>谷歌公司高性能团队核心成员的权威之作. 一直听说HTTP2.0,对此也仅仅是耳闻,没有具体研读过,这次正好有两个篇章,分别讲HTTP1.1和HTTP2 ...
- spider RPC入门指南
本部分将介绍使用spider RPC开发分布式应用的客户端和服务端. spider RPC中间件基于J2SE 8开发,因此需要确保服务器上安装了JDK 8及以上版本,不依赖于任何额外需要独立安装和配置 ...
- 微信小程序开发日记——高仿知乎日报(中)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...
- Android 微信第三方登录(个人笔记)
今天在写微信登录,花了半天时间搞定.然后写下自己的笔记,希望帮助更多的人...欢迎各位指教. 微信授权登录,官方说的不是很清楚.所以导致有一部分的坑. 微信注册应用平台的应用签名,下载 微信签名生成工 ...
- oracle 误删数据恢复
1.根据时间点查系统版本号scn: select timestamp_to_scn(to_timestamp('2013-01-07 11:20:00','YYYY-MM-DD HH:MI:SS')) ...
- 大数据之Yarn——Capacity调度器概念以及配置
试想一下,你现在所在的公司有一个hadoop的集群.但是A项目组经常做一些定时的BI报表,B项目组则经常使用一些软件做一些临时需求.那么他们肯定会遇到同时提交任务的场景,这个时候到底如何分配资源满足这 ...
- 我的MYSQL学习心得(七) 查询
我的MYSQL学习心得(七) 查询 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...
- ASP.NET Core 在 JSON 文件中配置依赖注入
前言 在上一篇文章中写了如何在MVC中配置全局路由前缀,今天给大家介绍一下如何在在 json 文件中配置依赖注入. 在以前的 ASP.NET 4+ (MVC,Web Api,Owin,SingalR等 ...
- 开始mono开发
使用mono框架开发android程序,第一步当然是构建开发环境,严格意义上说是使用 mono for android开发android程序. 参考Mono for Android安装配置破解 mo ...