Django ForeignKey反向查询中filter和_set的效率比较
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,本篇内容介绍了"Django ForeignKey反向查询中filter和_set的效率比较"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情
千家信息网最后更新 2025年11月07日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安全错误
数据库的锁怎样保障安全
将心软件开发公司
lol服务器连接不上
昌平电脑服务器回收
一台电脑二个dns服务器
设备联网服务器价格
网络安全大赛实景图
学习网络技术可以做软件吗
sql数据库用户登录信息
软件开发实例分析
怀旧服服务器哪个平台好
易语言小型数据库
网络安全人才市场需求
qt文件存数据库
云计算服务器linux
电话网络技术开发咨询报价
湖北省广电网络技术部电话
数据库占用内存过大
服务器管理软件 破解
深圳数据网络技术开发厂家现货
科技大学互联网学校
docker 如何发布到服务器
一台电脑二个dns服务器
手机矿机软件开发公司
连接到服务器上的硬盘怎么修复
网络安全了解多少
软件开发风险评估有哪些
浙江智能软件开发定做价格
魔兽世界暗影国度选择哪个服务器
数据库列类型
怎么用运行查看电脑数据库