详解Django中views数据查询使用locals()函数进行优化
作者:303donatello 发布时间:2021-01-21 00:53:13
标签:Django,locals(),优化
优化场景
利用视图函数(views)查询数据之后可以通过上下文context、字典、列表等方式将数据传递给HTML模板,由template引擎接收数据并完成解析。但是通过context传递数据可能就存在在不同的视图函数中使用重复的查询语句,所以可以通过将重复查询语句设置全局变量,配合locals()函数进行数据查询与传递。
优化前
def index(request):
threatname = '威胁情报展示'
url = 'www.testtip.com'
allthreat = Threat.objects.all()
#推荐位的威胁情报
rec = Threat.objects.filter(rec__id=1)[:3]
#情报标签
threat_tags = Tag.objects.all()
#将上述数据封装至上下文中
context = {
'threatname': threatname,
'url': url,
'allthreat': allthreat,
'rec':rec,
'threat_tags':threat_tags,
}
#通过render传递上下文至模板templates
return render(request,'index.html',context)
def threatshow(request,tid):
allthreat = Threat.objects.all()
#推荐位的威胁情报
rec = Threat.objects.filter(rec__id=1)[:3]
#情报标签
threat_tags = Tag.objects.all()
# 热门情报数据
hot_threat = Threat.objects.filter(hot__id=x)[:6]
#将sitename&url&allarticle封装至上下文中
context = {
'allthreat': allthreat,
'rec':rec,
'threat_tags':threat_tags,
'hot_threat':hot_threat,
}
return render(request, 'threatshow.html',context)
上面可以看到 views 里面有 index() 和 threatshow() 两个视图函数,在这两个视图函数中有三个相同的数据查询语句:
allthreat = Threat.objects.all()
#推荐位的威胁情报
rec = Threat.objects.filter(rec__id=1)[:3]
#情报标签
threat_tags = Tag.objects.all()
优化后
设置全局变量
# 全局定义常用查询数据参数
def global_variable(request):
allthreat = Threat.objects.all()
#推荐位的威胁情报
rec = Threat.objects.filter(rec__id=1)[:3]
#情报标签
threat_tags = Tag.objects.all()
return locals()
views 中定义上述全局变量后,通过locals()函数优化如下:
def index(request):
threatname = '威胁情报展示'
url = 'www.testtip.com'
#通过render传递上下文至模板templates
return render(request,'index.html',locals())
def threatshow(request,tid):
# 热门情报数据
hot_threat = Threat.objects.filter(hot__id=x)[:6]
return render(request, 'threatshow.html',locals())
Python 中的 locals() 函数会以字典类型返回当前位置的全部局部变量,也就是返回当前 index() 、 threatshow() 视图函数中定义的局部数据查询结果,加上全局变量当中已经完成了其他剩余数据查询,所以在满足数据查询需求的基础上完成了视图函数优化。
来源:https://www.cnblogs.com/303donatello/p/13548859.html


猜你喜欢
- 如何保持数据库中原有格式不变:这些问题在论坛里面几乎天天有人问~!其实当在输入信息,然后提交信息的时候,所有内容的格式是没有变的。只是在当提
- 发现很多朋友对 CSS 的优先权不甚了解,规则很简单。需要说明的一点,如果你的样式管理需要深层判断 CSS 的优先权,更应反思自己的 CSS
- 1. 写在前面的话在开发数据库时,特别是写存储过程,遇到比较复杂的需求,使用临时表可以简化很多逻辑。曾经在一家互联网金融公司供职,公司数据组
- 前端开发时,请求后台接口经常需要跨域,vue-cli实现跨域请求只需要打开config/index.js,修改如下内容即可。//例如要请求的
- requests模块:python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高。作用:模拟浏览器发请求。提示:老版使用
- 1、基于字典的创建规划问题上篇中介绍了使用 LpVariable 对逐一定义每个决策变量,设定名称、类型和上下界,类似地对约束条件也需要逐一
- Python时间格式化的时候,去掉前导0的:dt = datetime.now() print dt.strftime('%-H
- 区别IE6与FF:background:orange;*background:blue;区别IE6与IE7:background:green
- 举个例子来说,要查找出2007-10-12至2007-10-31之间在网站上注册的会员,选择好日期后,点击“查询”按钮,发现2007-10-
- 本文实例讲述了Python实现给qq邮箱发送邮件的方法。分享给大家供大家参考。具体实现方法如下:#-*-coding:utf-8-*- &n
- 学习https://matplotlib.org/gallery/index.html 记录,描述不一定准确,具体请参考官网Matplotl
- 用Python编写关于计算图形面积的代码实现,供大家参考,具体内容如下#寒假打卡28天第7天import mathclass Round()
- 本文实例讲述了Python多线程编程之多线程加锁操作。分享给大家供大家参考,具体如下:Python语言本身是支持多线程的,不像PHP语言。下
- global 标识用于在函数内部,修改全局变量的值。我们可以通过以下规则,来判定一个变量到底是在全局作用域还是局部作用域:变量定义在全局作用
- 1.首先定义一个log文件# -*- coding: utf-8 -*-import osimport timeimport logging
- 全球数据量的疯狂增长,使得市场对资深数据库管理员的需求也节节攀升。据统计,一直到2016美国IT市场对数据库管理员的需求量增长都将会超过所有
- windows 下安装mysql,供大家参考,具体内容如下1.先下载好 mysql5.7 版本的安装包,可以去官网自己下载2.下载后双击安装
- 系列教程MySQL系列之开篇 MySQL关系型数据库基础概念 MySQL系列之一 MariaDB-server安装 MySQL系列之二 多实
- 如何用JAVASCRIPT格式化数字成货币那种表示法?,比如说 34585962.00显示 为 34,585,962.00<scrip
- 特殊方法一览在 Python 的学习和使用过程中, 你一定碰到过一些 特殊方法, 它们开头和结尾都有两条下划线, 也叫魔法方法 (Magic