Django ForeignKey反向查询中filter和_set的效率比较
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容介绍了"Django ForeignKey反向查询中filter和_set的效率比较"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情
千家信息网最后更新 2026年11月01日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安全错误
数据库的锁怎样保障安全
互联网科技园
什么是科技互联网
互联网科技媒体
互联网金融科技创新
伴你行互联网科技有限公司
天下捷融互联网科技
互联网科技宣传片
互联网金融和金融科技
太原新华互联网科技学校怎么样
深圳市运趣互联网科技有限公司
江苏南京365互联网科技
崇明区互联网教育科技售后服务
中国科技创新与世界互联网大会
燊美集互联网科技有限公司
上海京穆互联网科技有限公司
互联网硬科技公司
抖集互联网科技技术咨询
国产互联网科技公司
亚光科技低轨卫星互联网
互联网科技创新方面的资料
保险科技 互联网保险
百单网互联网科技有限公司怎么样
深圳科技互联网
互联网与未来科技
互联网科技排名
汇久创客互联网科技
上海亿帐通互联网科技
黑科技闪耀互联网之光
广州百诚互联网科技有限公司官网
恒生科技互联网指数十大成分股