- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
本篇笔记为Django笔记系列之十二,首发于公号【Django笔记】 。
本篇笔记将介绍查询中的 defer 和 only 两个函数的用法,笔记目录如下:
defer 的英语单词的意思是 延迟、推迟 ,我们可以通过将字段作为参数传入,可以达到在获取数据的时候指定不获取该字段数据,常用于一些 textfield 字段上.
假设我们有一个 TestModel,有一个字段名为 text_field,字段类型为 textfield,里面存了大量字符串数据. 。
那么如果我们在获取这个 model 数据的时候,只想要这个 model 的其他字段信息, text_field 字段的内容我们在这一次用不上,那么我们就可以通过 defer() 方法来指定不获取该字段内容.
因为对于这一类大容量数据,系统在从数据库中 fetch 数据的时候会花费大量时间,而这部分不必要的时间我们是可以避免的.
TestModel.objects.defer("text_field")
上面的语句将 text_field 这个字段名作为参数传入 defer() 函数,系统返回数据的时候将不会返回他的字段.
我们以 Blog 这个model为例对这个函数进行测试,我们获取 Blog 的数据,但是指定不获取 name 这个字段的数据:
Blog.objects.defer("name")
我们可以打印一下这条命令执行的 SQL 语句:
Blog.objects.defer("name").query.__str__()
SELECT `blog_blog`.`id`, `blog_blog`.`tagline` FROM `blog_blog`
可以看到转化的 SQL 语句没有把我们指定的 name 字段返回.
不获取外键关联的某些字段 。
如果我们通过 select_related 关联了外键数据,也可以指定不获取外键的某些字段,比如:
Entry.objects.select_related("blog").defer("blog__name")
这样,在获取关联的 blog 的数据的时候,就不会获取 blog 的 name 字段数据.
defer 多字段 。
Entry.objects.defer('headline', 'body_text')
主键字段不能defer 。
有一些字段我们是 defer 也不会生效的,比如 model 的主键字段 id.
Blog.objects.defer("id")
上面的操作,系统不会报错,但是也不会生效.
关联外键数据,外键数据不应该被 defer 。
假设我们通过 Entry 来关联获取 Blog 数据,那么,关联的外键字段 blog_id,则不应该被 defer(),否则会报错.
# 下面的写法会报错
Entry.objects.select_related("blog").defer("blog_id")
访问被 defer 的字段 。
假设我们在获取 Blog 数据的时候,defer 了 name 字段,那么我们还可以访问 name 字段吗?
答案是可以的,不过因为我们在第一步的时候没有获取该字段,所以访问该字段的时候,系统会再次请求一遍数据库.
blog = Blog.objects.defer("name").first()
"""
这个时候打印出 blog 的所有字段是:
blog.__dict__
{'_state': <django.db.models.base.ModelState object at 0x7fb2de420668>, 'id': 1, 'tagline': 'asd'}
"""
print(blog.name) # 访问被 defer 的字段,系统会再次请求数据库
"""
这个时候再次打印出 blog.__dict__ 内容是:
{'_state': <django.db.models.base.ModelState object at 0x7fb2de420668>, 'id': 1, 'tagline': 'asd', 'name': 'hunter'}
"""
与 defer() 方法的作用相反,only() 的意思是只获取指定的字段,比如:
Entry.objects.only("headline", "rating")
与之对应的 SQL 是:
SELECT `blog_entry`.`id`, `blog_entry`.`headline`, `blog_entry`.`rating` FROM `blog_entry`
同样的,如果访问没有指定的字段,系统会再次查询数据库.
如果是多个 only 连用,那么系统只有最后一个 only 的字段会生效:
Entry.objects.only("headline", "rating").only("body_text") # 只会获取 body_text 字段数据
作用效果跟 order_by() 一样,后面的参数会覆盖前面的.
defer 和 only 连用 。
我们可以尝试一下 defer 和 only 的先后顺序,字段是否相同,前者的字段覆盖后者,以及后者的字段覆盖前者等情况,这里不做展开了.
因为,一般人谁会把这个两个函数一起用呢。。。。。.
以上就是本篇笔记所有内容,下一篇笔记将介绍 get_or_create,update_or_create 等方法.
本文首发于本人微信公众号:Django笔记.
原文链接: Django笔记十二之defer、only指定返回字段 。
如果想获取更多相关文章,可扫码关注阅读:
最后此篇关于Django笔记十二之defer、only指定返回字段的文章就讲到这里了,如果你想了解更多关于Django笔记十二之defer、only指定返回字段的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
在 javascript 中使用 defer 属性的正确语法是什么? 我见过有两种方式: 1: ... 2: ... 根据经验 [和我找不到的引用资料],我更倾向于使用第二个选项,但我只是仔细检查了
有什么区别 var dfd = new $.Deferred 和 var dfd = $.Deferred 在哪些情况下需要使用 new 与不使用它? 最佳答案 jQuery official doc
给定使用 Promise 构造函数的代码 let promise = () => new Promise(resolve => resolve(1)); new Promise((resolve, r
我正在研究 RxKotlin,问题出现了:defer() 和 defer{} 有什么区别 最佳答案 defer() 和 defer {} 只是写同一件事的两种方式。 Kotlin 在某些特定情况下允许
我正在尝试使用 Python 在 Google App Engine 上执行此操作: def add_to_db(person): a = PersonDb(key_name = perso
所以我有一个延迟对象数组dataCalls。 目前我正在使用以下方法来解雇所有这些,并在所有 Deferreds 解决后调用回调: $.when.apply(null, dataCalls) .
考虑以下几点: function foo(){ // Returns the jQuery deffered below. var urlToUse; $.ajax({
我刚刚看到此代码已被弃用,我一直在尝试遵循此指南:http://www.codelord.net/2015/09/24/$q-dot-defer-youre-doing-it-wrong/以正确的方式
我有一些元素,其中一些代码依赖于其他 中的代码元素。我看到了defer属性在这里可以派上用场,因为它允许推迟执行代码块。 为了测试它,我在 Chrome 上执行了这个:http://jsfiddle
我需要向 jQuery 的 .when() 监视的函数添加未知数量(仅在运行时已知)的 .pipe() 调用。这些调用将基于另一个异步操作的 ajax 调用。请参阅下面的代码以获得更清晰的解释: $.
我正在使用 GAE 的“deffered” ' 库 (python),它会在出现异常时自动重试任务。 有没有办法知道(在任务处理函数中)任务已尝试的次数? 我的最终目标是实现如下内容: if num_
我有几个 元素,其中一些代码依赖于其他 中的代码元素。我看到了defer属性在这里可以派上用场,因为它允许代码块在执行中被推迟。 为了测试它,我在 Chrome 上执行了这个:http://jsfi
在我看来,两者都做同样的事情。 文档: deferred.always() deferred.then() 最佳答案 看起来deferred.then()允许您传递两个单独的成功和失败回调,而 def
我正在使用 Twisted 编写代码,但在为我的扭曲互联网延迟变量想出一个合理的变量名时遇到了麻烦。这是我的候选人: d :太通用,太短,违反了 pylint 规则 C0103。 def :与内置函数
是否存在这样的情况:调用 .callback() 或 .errback() 会向调用者引发异常,而该异常不会被延迟捕获? 假设我有以下延迟和回调: from twisted.internet impo
这是代码: http://jsbin.com/lizami/edit?js,console 将代码也粘贴到此处: var aaa = $.Deferred(); var bbb = function(
这是我的尝试: deferred.defer(class1().method1, class2.method2, arg) deferred.defer(class1().method1, class
我正在尝试使用 google.appengine.ext.deferred 来运行任务。我正在将一个方法传递给 defer() 方法,该方法成功运行,但在返回时抛出一个 ValueError: F
这个问题在这里已经有了答案: What's the difference between a Deferred object and its own promise object? (3 个答案)
我下载了一个名为 jsdeferred 的库来尝试帮助我解决一些代码流问题,但我有点迷茫,因为它的示例和...“文档” 在某些事情上有点不清楚。但是当我继续阅读和挖掘,当然还有谷歌搜索阳光下的一切时,
我是一名优秀的程序员,十分优秀!