表结构

先创建一个新的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方法(减少查询次数)的更多相关文章

  1. 遍历一个二维数组的简便方法(减少foreach次数)

    在一些特定场合可以使用下, 还是有局限性 输出结果 : 另一种场景 : 输出结果 : 更复杂的场景 : 输出结果 :

  2. Django 中的select_related函数优化查询

    参考链接: https://blog.csdn.net/secretx/article/details/43964607 在数据库有外键的时候,使用select_related()和prefech_r ...

  3. django models的点查询/跨表查询/双下划线查询

    django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...

  4. Django——8 关系表的数据操作 表关联对象的访问 多表查询

    Django 关系表中的数据操作 表关联对象的访问 关联对象的add方法 create方法 remove方法 clear方法 多表查询 查询补充 聚合查询 分组查询 F查询 Q查询 关系表的数据操作 ...

  5. Django models 单表查询

    从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet 1. 查看Django QuerySet执行的SQL .query.__str__()或 .query属性打印执行的sql语句 ...

  6. Django(九)模型:dj查询数据库的函数(方法)

    一.查询函数 通过模型类.objects属性可以调用如下函数,实现对模型类对应的数据表的查询. 函数表 函数名 功能 返回值 说明 get 返回表中满足条件的一条且只能有一条数据. 返回值是一个模型类 ...

  7. Django models .all .values .values_list 几种数据查询结果的对比

    Django models .all .values .values_list 几种数据查询结果的对比

  8. 关于Hibernate查询对象调用set方法自动同步到数据库解决方案

    Hibernate的get和load方法查询出的实体都是持久化对象,拿到该对象后,如果你调用了该对象的set方法,如果再同一个事务里面,那么在事务递交的时候,Hibernate会把你设置的值自动更新到 ...

  9. Django Models随机获取指定数量数据方法

    方法一:新增models的Manager方法 下面就直接发代码了 class RandomManager(models.Manager): def get_queryset(self): return ...

随机推荐

  1. .Net Core MVC 网站开发(Ninesky) 2.2、栏目管理功能-System区域添加

    在asp或asp.net中为了方便网站的结构清晰,通常把具有类似功能的页面放到一个文件夹中,用户管理功能都放在Admin文件夹下,用户功能都放在Member文件夹下,在MVC中,通常使用区域(Area ...

  2. Xamarin+Prism开发详解一:PCL跨平台类库与Profile的关系

    在[Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用]中提到过以下错误,不知道大伙还记得不: 无法安装程序包"Microsoft.Identity.Client 1.0. ...

  3. css元素水平居中和垂直居中的方式

    关于居中的问题,一直处于疑惑不解的状态,知道的几种方法好像也不是每一次都会起到作用,所以更加迷惑.主要是不清楚该 在什么情况下采用哪种解决方法,所以,整理了一些方法,梳理一下思路,做一个总结. 1. ...

  4. BlockingCollection使用

    BlockingCollection是一个线程安全的生产者-消费者集合. 代码 public class BlockingTest { BlockingCollection<int> bc ...

  5. GOF23设计模式归类

    创建型模式:-单例模式.工厂模式.抽象工厂模式.建造者模式.原型模式结构型模式:-适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式行为型模式:-模板方法模式.命令模式.迭代器模式 ...

  6. Mysql 学习之基础操作

    一.表复制 1.复制表结构    将表hello的结构复制一份为表hello3 2.复制数据 a.如果两张表的结构一样且你要复制所有列的数据 mysql> insert into hello3 ...

  7. Linux 权限设置chmod

    Linux中设置权限,一般用chmod命令 1.介绍 权限设置chmod 功能:改变权限命令.常用参数: 1=x(执行权execute) 2=w(写权write) 4=r(读权Read) setuid ...

  8. Windows 上安装 Jekyll.

    Jekyll是一个静态网站生成工具.它允许用户使用HTML.Markdown或Textile来建立静态页面,然后通过模板引擎Liquid(Liquid Templating Engine)来运行. 原 ...

  9. 【Knockout.js 学习体验之旅】(2)花式捆绑

    本文是[Knockout.js 学习体验之旅]系列文章的第2篇,所有demo均基于目前knockout.js的最新版本(3.4.0).小茄才识有限,文中若有不当之处,还望大家指出. 目录: [Knoc ...

  10. Cowboy 开源 WebSocket 网络库

    Cowboy.WebSockets 是一个托管在 GitHub 上的基于 .NET/C# 实现的开源 WebSocket 网络库,其完整的实现了 RFC 6455 (The WebSocket Pro ...