关于Django ForeignKey 反向查询中filter和_set的效率对比详解


Posted in Python onDecember 15, 2018

前言

大家使用 Django 创建模型的时候一定会经常使用 ForeignKey 来创建两个表格之间多对一的外键关系,例如B中有一个 models.ForeignKey(A) 。而当我们需要反向查询 A 中某个具体实例所关联的 B 时,可能会用到 A.B_set.all() 或 B.objects.filter(A) 这两种不同的方法。

不知道大家有没有也想过一个问题:当网站实际上线后,SEO强调页面加载速度,而当面对不断增大的请求量,这两种方法的哪一种速度更快?

馆主我产生了这个疑问,所以就打算跑一下试试看看。馆主尚属小白,如有不对的地方,还请各位客官登录一下账号,留言指点!

实验环境

操作系统: Manjaro Linux 17.1-rc2 
Python: Python 3.6.3 
Django: Django 1.11.7 
数据库: SQLite 3.21.0 
CPU: i3-4130 @ 3.4GHz 
内存: DDR3 1600 8G + 4G

实验计划

分别创建“问题”模型 Questions 和“答案”模型 Answers ,答案模型对于问题模型存在多对一关系 ForeignKey 创建一个问题和两个答案。然后分别使用两种不同的方法运行查询数据 10000 次比较消耗的时间。

实验实施

创建实验模型

# myapp/models.py

from django.db import models

class Questions(models.Model):
  '''问题的模型'''
  title = models.CharField('标题', max_length=100)
  content = models.TextField('描述')


class Answers(models.Model):
  '''答案的模型'''
  question = models.ForeignKey(Questions, on_delete=models.CASCADE, verbose_name='问题')
  content = models.TextField('答案')

然后我们进入 django 的 shell 为模型增加数据并编写我们的测试。

>>> from myapp.models import Questions, Answers

# 创建第一个问题
Questions.objects.create(
  title = '这是第一个问题么?'
  content = '我认为这是第一个问题,不知道是不是真的啊?'
  )

# 创建第一个答案
Answers.objects.create(
  question = Questions.objects.get(pk=1),
  content = '你说对了了,这是第一个问题'
  )


# 创建第二个答案
Answers.objects.create(
  question = Questions.objects.get(pk=1),
  content = '题主,你是第一个问题,但我是第二个答案么?'
  )

利用 timeit 测试两种方法消耗的时间

from timeit import timeit

# 构建使用 _set 方法的函数
def time_test_1():
  question = Question.objects.get(pk=1)
  answers = question.answers_set.all()


# 构建使用 filter 方法的函数
def time_test_2():
  question = Question.objects.get(pk=1)
  answers = Answers.objects.filter(question=question)

# 使用 timeit 测试 10000 次
timeit(time_test_1, number=10000)
5.346277045000534

timeit(time_test_2, number=10000)
5.11136907800028

实际经过多次测试,至少我这样的用法来看 使用A.B_set.all() 反向查询消耗的时间总是比 B.objects.filter(A) 过滤筛选方法多消耗 0.2 - 0.3 秒钟左右。所以但从时间成本来考虑的话还是使用 filter 筛选效率更高一些。

以上这篇关于Django ForeignKey 反向查询中filter和_set的效率对比详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python基础语法(Python基础知识点)
Feb 28 Python
13个最常用的Python深度学习库介绍
Oct 28 Python
Python Logging 日志记录入门学习
Jun 02 Python
python最长回文串算法
Jun 04 Python
python使用turtle库绘制时钟
Mar 25 Python
python同时遍历数组的索引和值的实例
Nov 15 Python
python求平均数、方差、中位数的例子
Aug 22 Python
Python使用scipy模块实现一维卷积运算示例
Sep 05 Python
Django 博客实现简单的全文搜索的示例代码
Feb 17 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
Mar 08 Python
无需压缩软件,用python帮你操作压缩包
Aug 17 Python
python unittest单元测试的步骤分析
Aug 02 Python
django 外键model的互相读取方法
Dec 15 #Python
Django之Mode的外键自关联和引用未定义的Model方法
Dec 15 #Python
python调用java的jar包方法
Dec 15 #Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
Dec 15 #Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
Dec 15 #Python
浅谈python 导入模块和解决文件句柄找不到问题
Dec 15 #Python
对python当中不在本路径的py文件的引用详解
Dec 15 #Python
You might like
PHP写UltraEdit插件脚本实现方法
2011/12/26 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
thinkPHP微信分享接口JSSDK用法实例
2017/07/07 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
setAttribute 与 class冲突解决
2008/02/17 Javascript
js跑马灯代码(自写)
2013/04/17 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
2013/11/08 Javascript
详解JavaScript的Polymer框架中的通知交互
2015/07/29 Javascript
Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
2015/12/02 Javascript
jQuery表格插件datatables用法详解
2020/11/23 Javascript
快速掌握Node.js环境的安装与运行方法
2016/02/16 Javascript
微信小程序 弹幕功能简单实例
2017/02/14 Javascript
JavaScript创建对象的七种方式全面总结
2017/08/21 Javascript
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
2017/10/24 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
2018/03/17 Javascript
select2 ajax 设置默认值,初始值的方法
2018/08/09 Javascript
angularJs中ng-model-options设置数据同步的方法
2018/09/30 Javascript
浅谈Vue.js中如何实现自定义下拉菜单指令
2019/01/06 Javascript
Vue实现穿梭框效果
2020/09/30 Javascript
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
[01:00:11]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第一场 2月7日
2021/03/11 DOTA
python基础教程之基本数据类型和变量声明介绍
2014/08/29 Python
bat和python批量重命名文件的实现代码
2016/05/19 Python
详解Python里使用正则表达式的ASCII模式
2017/11/02 Python
Django model 中设置联合约束和联合索引的方法
2019/08/06 Python
python匿名函数的使用方法解析
2019/10/10 Python
python中四舍五入的正确打开方式
2021/01/18 Python
浅谈css3中calc在less编译时被计算的解决办法
2017/12/04 HTML / CSS
以设计师精品品质提供快速时尚:Mostata
2019/05/10 全球购物
领导干部培训感言
2014/01/23 职场文书
开业庆典策划方案
2014/02/18 职场文书
网络编辑职责
2014/03/01 职场文书
淘宝客服专员岗位职责
2014/04/11 职场文书
小学生优秀评语大全
2014/04/22 职场文书
竞选班干部演讲稿
2014/04/24 职场文书
运动会演讲稿50字
2014/08/25 职场文书