首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

select_related和prefetch_related -在查询中未获取结果

select_related和prefetch_related是Django框架中用于优化数据库查询的两个方法。

select_related方法用于在查询中获取相关联的对象。它通过使用SQL的JOIN操作,将相关联的对象一起获取,减少了数据库查询的次数,提高了查询效率。select_related适用于一对一或一对多关系的查询。

prefetch_related方法用于在查询中预先获取相关联的对象集合。它通过使用SQL的IN查询,将相关联的对象集合一起获取,减少了数据库查询的次数,提高了查询效率。prefetch_related适用于多对多关系的查询。

这两个方法的使用可以减少数据库查询的次数,提高查询效率,尤其在查询大量数据或者存在多层级关系的数据时效果更为明显。

在应用场景上,select_related适用于需要获取相关联对象的属性或者进行相关联对象的过滤查询的场景。而prefetch_related适用于需要获取相关联对象集合或者进行相关联对象集合的过滤查询的场景。

对于select_related和prefetch_related的具体使用方法和示例,可以参考腾讯云的Django文档中的相关章节:

  • select_related:https://cloud.tencent.com/document/product/1103/36740
  • prefetch_related:https://cloud.tencent.com/document/product/1103/36741
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

django select_relatedprefetch_related的用法与区别

今天我们再来学习两个非常重要的查询方法select_relatedprefetch_related方法,看看如何使用它们避免不必要的数据库查询。高手过招,只差分毫。...我们先分析下这会什么会发生,然后再解释如何使用select_relatedprefetch_related方法解决这个问题。 为什么会有重复查询?...当我们模板调用{{ article.category.name }} {{ tag.name }}显示categorytags的名字时,Django还需要重新查询blog_categoryblog_tag...现在我们对article_list视图函数稍微进行修改,加入select_related方法,查询文章列表时同时一次性获取相关联的category对象信息,这样模板调用 {{ article.category.name...,请一定记住使用select_relatedprefetch_related一次性获取所有对象信息,从而提升数据库查询效率,避免重复查询

1.3K20
  • Django进阶-9-ORM分组与聚合查询

    : print(row.name) 这种查询方式第一次发送 查询请求每for循环一次也会发送查询请求 ② select_related() 结果为对象 注意query_set类型的对象...().select_related('category') for row in obj_list: print(row.category.name) ③ prefetch_related...() 做连表操作依然会影响查询性能,所以出现prefetch_relatedprefetch_related:不做连表,多次单表查询外键表 ,去重之后显示, 2次单表查询(有几个外键做几次1+N次单表查询...print(obj.category.name) 二、ORM 分组聚合查询 ① aggregate(*args,**kwargs) 聚合函数 通过对 QuerySet 进行计算,返回一个聚合值的字典...aggregate() 每一个参数都指定一个包含在字典的返回值。即在查询集上生成聚合。

    1K20

    Django ORM:天使与魔鬼 II

    Django 我们通常会使用 selected_related 或prefetch_related 来预取关联对象,来减少 DB 之间的交互,但是使用上也需要有一些注意的地方。...,但如果我们调用时不加任何参数:Foo.objects.all().prefetch_related() ,默认地 Django 会将所有关联字段都取出来,加入 Baz 表无比巨大,本来用作性能优化的...此时在后续的循环处理,我们需要通过 Foo 对象查询到 Baz 的数据,为了避免 N + 1 我们也会多级预取: Foo.objects.filter().select_related("bars")....prefetch_related("bars__bazs") 此时二级预取也是默认获取全部字段,倘若 Baz 表中有一个需要额外耗时序列化的字段,同样会使优化适得其反。...Foo.objects.filter().select_related("bars") .prefetch_related( Prefetch("bars__bazs", queryset=Baz.objects.defer

    72350

    提高Djang查询速度的9种方法

    引言Web应用程序,数据库查询是一个关键的环节。优化数据库查询可以显著提高应用程序的性能响应速度。Django作为一个高度可扩展的Web框架,提供了多种方式来优化数据库查询。...目录索引的优化查询集的延迟加载使用select_related进行关联查询使用prefetch_related进行预取延迟计算字段使用values()values_list()方法选择需要的字段使用annotate...使用select_related进行关联查询涉及到关联表的查询,使用select_related()方法可以减少数据库查询的次数。...使用prefetch_related进行预取进行跨关联的查询时,使用prefetch_related()方法可以有效地减少数据库查询次数。...使用F()Q()对象进行复杂查询Django的F()对象Q()对象提供了一种方便的方式来构建复杂的查询。F()对象可以查询引用模型的字段,而Q()对象可以组合多个查询条件。

    30020

    Django笔记(十二)连表查询之性能提升

    目录 回顾之前的外键查询 第一个方法 第二个方法(select_related()连表查,性能差) 第三个方法(prefetch_related()多次单表查,性能高) 回顾之前的外键查询 之前有两个表...循环获取数据,再获取外键里面的数据的时候,会再次的执行sql语句进行数据库的查询。 所以,性能不好,能不能在查询数据的时候,就把外键关联的另一个表里面的数据也查询出来呢?...但是这个查询出来的值的类型是字典类型 如果不想要查询出来的是字典类型,还想提高性能,如何做?...第二个方法(select_related()连表查,性能差) 数据多,用这个 那么这样写查询的sql语句是什么 SELECT `myfirst_article`....`id`) 也就是用INNER JOIN 进行关联查询 也就是第一次查询的时候主动做连表 连表会慢,效率低 第三个方法(prefetch_related()多次单表查,性能高) 数据多用这个

    89620

    Django-model进阶(中介模型,查询优化,extra,整体插入)

    请求”查询集 的结果时才会到数据库中去获取它们。...一个新创建的查询集中,缓存为空。首次对查询集进行求值 —— 同时发生数据库查询 ——Django 将保存查询结果查询集的缓存并返回明确请求的结果(例如,如果正在迭代查询集,则返回下一个结果)。...查询集不会永远缓存它们的结果。当只对查询集的部分进行求值时会检查缓存, 如果这个部分不在缓存,那么接下来查询返回的记录都将不会被缓存。所以,这意味着使用切片或索引来限制查询集将不会填充缓存。...下面的例子解释了普通查询select_related() 查询的区别。...prefetch_related()select_related()的设计目的很相似,都是为了减少SQL查询的数量,但是实现的方式不一样。后者是通过JOIN语句,SQL查询内解决问题。

    1.6K70

    Django查询优化及ajax编码格式原理解析

    orm查询优化 1)only与refer ​ only方法返回的是一个queryset对象,本质就是列表套数据对象 ​ 该对象内只含有only括号所指定的属性(其他属性也可以获取,但是需要重新走数据库查询...与prefetch_related select_related括号内只能放外键字段,并且外键字段的类型只能是一对一或一对多,内部是联表操作,会将外键关联的表与当前表直接拼接起来,然后再执行查询操作,返回的结果也是一个...queryset,列表套数据对象,该数据对象获取当前表的数据或者关联表的数据,都不会再走数据库; prefetch_related 括号内外键字段全部支持,内部是子查询,返回的结果也是一个queryset...对象,列表套数据对象,该数据对象获取当前表的数据或者关联表的数据,都不会再走数据库; 第一个方法耗时主要耗联表操作,第二个方法耗时主要耗查询次数; choices字段 用在一些字段数据是可以明确列出所有的可能的...,然后分别放到不同的方法POSTFILES; 以上就是本文的全部内容,希望对大家的学习有所帮助。

    1.6K10

    Django学习笔记之Queryset详解

    可以使用双下划线对OneToOne、OneToMany、ManyToMany进行关联查询反向关联查询,方法与filter()的使用方法相同。...的实现 SQL,很多关键词删、改、查时都是可以用的,如order by、 like、in、join、union、and、or、not等等,我们以查询为例,说一下django如何映射SQL的这些关键字的...select_related()不能用于OneToMany的反向连接,ManyToMany,这些都是model的一条记录对应关联表的多条记录。...看下面两段代码,这两段代码1.1提到过。代码1遍历a前,先执行a对应的SQL,拿到数据后,然后再遍历a,而遍历过程,每次都还要查询数据库获取关联表。...select_related是用select ……join来返回关联的表字段,而prefetch_related是用多条SQL语句的形式查询,一般,后一条语句用IN来调用上一句话返回的结果

    2.7K30

    07.Django学习之model进阶

    请求”查询集 的结果时才会到数据库中去获取它们。...叫做queryset缓存空间 一个新创建的查询集中,缓存为空。首次对查询集进行求值 —— 同时发生数据库查询 ——Django 将保存查询结果查询集(非简单查询查询结果,简单查询往下看。)...的缓存并返回明确请求的结果(例如,如果正在迭代查询集,则返回下一个结果)。接下来对该查询集 的求值将重用缓存的结果。 请牢记这个缓存行为,因为对查询集使用不当的话,它会坑你的。...下面的例子解释了普通查询select_related() 查询的区别。...prefetch_related()select_related()的设计目的很相似,都是为了减少SQL查询的数量,但是实现的方式不一样。后者是通过JOIN语句,SQL查询内解决问题。

    2K30

    Django数据库查询优化与AJAX

    only only括号内放字段,查询结果是一个列表套一个个数据对象,这些数据对象点括号内的字段属性,不会再查数据库,直接就是对象获取属性;也支持点其他属性,但是其他属性会每拿一条数据就走一次数据库。...select_relatedprefetch_related select_related 括号内只能放一对一、一对多的外键字段,特点:内部自动连表操作,会将括号内外键字段所关联的表与当前表自动拼接成一张表...prefetch_related内部是子查询(当一个查询是另一个查询的条件时,称之为子查询。)...,特点:按步骤查询多张表,然后将查询结果封装到对象,给用户的感觉好像还是连表操作,括号内支持传多个外键字段,每放一个外键字段就会多走一条SQL语句,多查一张表。...(这一特点给用户的感受是不知不觉完成请求和响应过程) AJAX 不需要任何浏览器插件,但需要用户允许JavaScript浏览器上执行。

    2.4K20

    浅谈Django QuerySet对象(模型.objects)的常用方法

    执行完上述代码之后就在book创建了一个新的属性author_name,但是只在内存,不会映射到数据库中去。 4.order_by: 指定将查询结果根据某个字段进行排序。...那么select_related里面只能传如这两个参数,而不能传入别的参数,如BookOrder,因为我们是BookOrder设置的外键连接到Book,并没有Book设置外键连接到BookOrder...9. prefetch_related: 这个方法select_related非常的类似,就是访问多个表的数据的时候,减少查询的次数。这个方法是为了解决多对一多对多的关系的查询问题。...需求:从book通过prefetch_related查询BookOrder的信息。...方法也能办到select_related方法能办到的事情,只是select_related方法效率比prefetch_related方法效率高一点。

    3.8K20
    领券