Django ForeignKey反向查询中filter和_set的效率比较
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,本篇内容介绍了"Django ForeignKey反向查询中filter和_set的效率比较"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情
千家信息网最后更新 2025年01月20日Django ForeignKey反向查询中filter和_set的效率比较
本篇内容介绍了"Django ForeignKey反向查询中filter和_set的效率比较"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
前言
大家使用 Django 创建模型的时候一定会经常使用 ForeignKey 来创建两个表格之间多对一的外键关系,例如B中有一个 models.ForeignKey(A) 。而当我们需要反向查询 A 中某个具体实例所关联的 B 时,可能会用到 A.B_set.all() 或 B.objects.filter(A) 这两种不同的方法。
实验环境
操作系统: 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.pyfrom django.db import modelsclass 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.346277045000534timeit(time_test_2, number=10000)5.11136907800028
实际经过多次测试,至少我这样的用法来看 使用A.B_set.all() 反向查询消耗的时间总是比 B.objects.filter(A) 过滤筛选方法多消耗 0.2 - 0.3 秒钟左右。所以但从时间成本来考虑的话还是使用 filter 筛选效率更高一些。
"Django ForeignKey反向查询中filter和_set的效率比较"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
问题
模型
答案
方法
查询
时间
实验
测试
消耗
效率
数据
这是
不同
两个
内容
函数
实际
更多
知识
实用
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
dell emc服务器固件
国外在线代理服务器网站
软件测试转软件开发难嘛
给电话手表打电话显示服务器错误
青云服务器管理口用户密码
广电服务器多少钱
为做好网络安全保障工作
苏宁外包软件开发
天下叁海棠末雨服务器
怎么下载oracle数据库
网络安全三同步定义
智能软件开发专业职业定位
云上译码服务器怎么连接
ibm刀片服务器图片
家用 智能 管理服务器
济南软件开发工资一般多少知乎
高级网络安全管理员是什么样的
如何维护自己的网络安全权益
有梗网络技术
人口分布数据库能干什么
达梦数据库与mysql性能
dell 820服务器
万马奔腾网络技术有限公司
荔枝直播软件开发
研发部网络安全管理
黄浦区智能网络技术诚信服务
一台服务器多个ssh证书
网络安全中真实性
新闻传播与网络安全
举办网络安全讲座英语