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

django模型select_related或prefetch_related子模型

django模型中的select_related和prefetch_related是用于优化数据库查询的方法。

select_related是一种查询优化方法,它通过在查询时使用JOIN操作,将相关联的表一起查询出来,从而减少数据库查询的次数。它适用于一对一或一对多关系的查询,可以减少数据库的访问次数,提高查询性能。在使用select_related时,需要在查询中指定相关联的字段或关联模型。

prefetch_related是另一种查询优化方法,它通过使用两条独立的查询语句,先查询主模型,然后再查询关联模型,最后将两者通过内存中的数据进行关联。它适用于多对多或多对一关系的查询,可以减少数据库的访问次数,提高查询性能。在使用prefetch_related时,需要在查询中指定相关联的字段或关联模型。

这两种方法在查询大量数据时特别有用,可以避免产生大量的数据库查询,提高查询效率。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云数据库MySQL:https://cloud.tencent.com/product/cdb
  • 腾讯云数据库PostgreSQL:https://cloud.tencent.com/product/postgres
  • 腾讯云对象存储COS:https://cloud.tencent.com/product/cos
  • 腾讯云云服务器CVM:https://cloud.tencent.com/product/cvm
  • 腾讯云人工智能AI:https://cloud.tencent.com/product/ai
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

django select_relatedprefetch_related的用法与区别

今天我们再来学习两个非常重要的查询方法select_relatedprefetch_related方法,看看如何使用它们避免不必要的数据库查询。高手过招,只差分毫。...我们先分析下这会什么会发生,然后再解释如何使用select_relatedprefetch_related方法解决这个问题。 为什么会有重复查询?...Django考虑到了这一点,所以提供select_relatedprefetch_related方法来提升数据库查询效率,类似于SQL的JOIN方法。...,请一定记住使用select_relatedprefetch_related一次性获取所有对象信息,从而提升数据库查询效率,避免重复查询。...对与单对单单对多外键ForeignKey字段,使用select_related方法 对于多对多字段和反向外键关系,使用prefetch_related方法 两种方法均支持双下划线指定需要查询的关联对象的字段名

1.3K20

如何在Django中使用单行查询来获取关联模型的数据

Django 中,你可以使用单行查询来获取关联模型的数据。...这通常涉及使用查询集的 select_related prefetch_related 方法,这两个方法允许你在一次数据库查询中获取关联模型的数据,而不是分开的多个查询。...2、解决方案Django 提供了多种方法来进行单行查询,其中最常见的方法是使用 select_related() 和 prefetch_related()。...2.1 使用 select_related()select_related() 可以将关联模型的数据直接加载到主模型中,这样就可以在一次数据库查询中获取到所有需要的数据。...2.3 代码例子以下是一个完整的代码例子,演示如何使用 select_related() 和 prefetch_related() 来获取关联模型的数据:from django.db.models import

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

    目录索引的优化查询集的延迟加载使用select_related进行关联查询使用prefetch_related进行预取延迟计算字段使用values()和values_list()方法选择需要的字段使用annotate...在Django中,我们可以使用db_index属性在模型字段上创建索引。...使用select_related进行关联查询在涉及到关联表的查询中,使用select_related()方法可以减少数据库查询的次数。...select_related()方法会在查询时一次性将相关的对象也查询出来,而不是每次访问关联对象时都执行一次查询。例如,我们有一个Book模型和一个Author模型,它们之间存在一对多关系。...但有时我们只需要获取特定字段的值,这时可以使用values()values_list()方法来选择需要的字段,以减少数据传输和内存占用。

    28720

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

    所以,这意味着使用切片索引来限制查询集将不会填充缓存。...对于这些情况,Django 允许你指定一个中介模型来定义多对多关系。 你可以将其他字段放在中介模型里面。源模型的ManyToManyField 字段将使用through 参数指向中介模型。...Django >= 1.7,链式调用的select_related相当于使用可变长参数。Django < 1.7,链式调用会导致前边的select_related失效,只保留最后一个。...prefetch_related()和select_related()的设计目的很相似,都是为了减少SQL查询的数量,但是实现的方式不一样。后者是通过JOIN语句,在SQL查询内解决问题。...的查询语法难以简单的表达复杂的 WHERE 子句,对于这种情况, Django 提供了 extra() QuerySet修改机制 — 它能在 QuerySet生成的SQL从句中注入新子句 extra可以指定一个多个

    1.6K70

    Django数据库查询优化与AJAX

    数据库设计三大范式 第一范式(1NF):列不可再分(原子性) 每一列属性都是不可再分的,两列的属性相近相似一样,应尽量合并属性一样的列,确保不产生冗余数据。...与prefetch_related select_related 括号内只能放一对一、一对多的外键字段,特点:内部自动连表操作,会将括号内外键字段所关联的表与当前表自动拼接成一张表,然后将表中的数据一个一个查询出来封装成一个一个的对象...select_related()括号内放多个外键字段,逗号隔开,会将多个外键字段关联的表与当前表拼成一张大表。...prefetch_related内部是查询(当一个查询是另一个查询的条件时,称之为查询。)...MTV(models templates views) models templates views:模型层、模板层、视图层 Django自称是MTV框架,其实本质还是MCV MCV(models views

    2.4K20

    07.Django学习之model进阶

    所以,这意味着使用切片索引来限制查询集将不会填充缓存。...对于这些情况,Django 允许你指定一个中介模型来定义多对多关系。 你可以将其他字段放在中介模型里面。源模型的ManyToManyField 字段将使用through 参数指向中介模型。...Django >= 1.7,链式调用的select_related相当于使用可变长参数。Django < 1.7,链式调用会导致前边的select_related失效,只保留最后一个。...prefetch_related()和select_related()的设计目的很相似,都是为了减少SQL查询的数量,但是实现的方式不一样。后者是通过JOIN语句,在SQL查询内解决问题。...的查询语法难以简单的表达复杂的 WHERE 子句,对于这种情况, Django 提供了 extra() QuerySet修改机制 — 它能在 QuerySet生成的SQL从句中注入新子句 extra可以指定一个多个

    2K30

    Django ORM:天使与魔鬼 II

    最近重操 CRUD 旧业,又有一些新的发现,故增加一篇 Django ORM:天使与魔鬼 Part II。...在 Django 中我们通常会使用 selected_related prefetch_related 来预取关联对象,来减少和 DB 之间的交互,但是在使用上也需要有一些注意的地方。...() ,默认地 Django 会将所有关联字段都取出来,加入 Baz 表无比巨大,本来用作性能优化的 prefetch_related 就会摇身变成耗时怪兽。...此时在后续的循环处理中,我们需要通过 Foo 对象查询到 Baz 的数据,为了避免 N + 1 我们也会多级预取: Foo.objects.filter().select_related("bars")...Foo.objects.filter().select_related("bars") .prefetch_related( Prefetch("bars__bazs", queryset=Baz.objects.defer

    71350

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

    models.Articles.objects.all() for row in obj_list: print(row.name) 这种查询方式第一次发送 查询请求每for循环一次也会发送查询请求 ② select_related...查询时主动完成连表形成一张大表,for循环时不用额外发请求; 试用场景: 节省硬盘空间,数据量少时候适用相当于做了一次数据库查询; obj_list=models.Articles.objects.all().select_related...,所以出现prefetch_relatedprefetch_related:不做连表,多次单表查询外键表 ,去重之后显示, 2次单表查询(有几个外键做几次1+N次单表查询) 适用场景:效率高,数据量大的时候适用...obj_list=models.Articles.objects.all().prefetch_related('category') for obj in obj_list:...from django.db.models import Avg,Sum,Max,Min #求书籍的平均价 ret=models.Book.objects.all().aggregate(Avg('price

    99320

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

    但是需要重新走数据库查询) defer与only互为反关系,返回的是一个queryset对象,本质就是列表套数据对象;该对象只含有除了defer括号内所指定的属性(括号内的属性也可以获取但是需要重新走数据库) 2)select_related...与prefetch_related select_related括号内只能放外键字段,并且外键字段的类型只能是一对一一对多,内部是联表操作,会将外键关联的表与当前表直接拼接起来,然后再执行查询操作,返回的结果也是一个...queryset,列表套数据对象,该数据对象获取当前表中的数据或者关联表中的数据,都不会再走数据库; prefetch_related 括号内外键字段全部支持,内部是查询,返回的结果也是一个queryset...基于ajax做数据交互,后端无论返回什么结果都会被回调函数捕获,不会再影响整个页面 前后端数据传输编码格式 urlencoded 数据格式username=zhang&password=123 django...能够识别; processData:false, # 浏览器不需要对数据进行任何处理 django能够识别对象中的普通的键值对和文件对象,然后分别放到不同的方法POST和FILES中; 以上就是本文的全部内容

    1.6K10

    DjangoDjango ORM 学习笔记

    将数据库表和对象模型关联,我们只需针对相关的对象模型进行编码,无须考虑对象模型和数据库表之间的转化,大大提高了程序的开发效率。 方便数据库的迁移。...ORM 中的关联查询也分两中 select_related(单关联实例) 和 prefetch_related(多关联实例) select_related select_related 用来处理单关联实例的情况...如果需要清除 QuerySet 上以前的 select_related 添加的关联字段,可以传入 None 做参数 prefetch_related prefetch_related 主要适用于 OneTwoMany...和 select_related 类似,prefetch_related 在查询时会同时取出关联实例的值。...与 select_related 不同的是 prefetch_related 不使用 JOIN 方式来查询数据库,而是分别查每个表,最后使用 Python 来实现 JOIN 操作。

    2.2K20

    Django项目知识点(四)

    Manager定义表级方法(表级方法就是影响一条多条记录的方法),我们可以以models.Manager为父类,定义自己的manager,增加表级方法; QuerySet:Manager类的一些方法会返回...() 附带查询关联对象 prefetch_related() 预先查询 extra() 附加SQL查询 defer() 不加载指定字段 only() 只加载指定的字段 using...() 如果我要拿这个模型通过外键绑定的另外一个模型,使用select_related course 模型定义了teacher字段绑定teacher模型 course = Course.objects.only...当我们需要对查询集(queryset)的某些字段进行计算进行先分组再计算排序, 我们就需要使用aggregate和annotate方法了。...aggregate(Max('price')) {'price__max': Decimal('81.20')} annotate 先介绍F,annotate 必用F F介绍 -个F()对象表示一个模型字段注释的列的值

    1.6K30

    Django学习笔记之Queryset详解

    QuerySet实例,QuerySet是一个可遍历结构,包含一个多个元素,每个元素都是一个Model 实例,它里面的方法也是表级方法,前面说了,Django给我们提供了增加表级方法的途径,那就是自定义...onetomany,那用select_related,不过对于onetomany,只能在主表(定义onetomany关系的那个表)的manager中使用select_related方法,即通过select_related...其实,prefetch_related()也能做select_related()的事情,但由于策略不同,可能相比select_related()要低效一些,所以建议还是各管各擅长的。...select_related是用select ……join来返回关联的表字段,而prefetch_related是用多条SQL语句的形式查询,一般,后一条语句用IN来调用上一句话返回的结果。...('best_pizza__toppings') 先用select_related查到best_pizza对象,再用prefetch_related 从best_pizza查出toppings 2.4.9

    2.7K30

    什么是ORM中的N+1

    还是拿代码来说事,上篇我们定义了一个User的模型,这次还继续沿用,然后增加一个Post(文章)的模型。User和Post是一对多的关系,也就是User是Post的外键。...代码如下: from django.db import models class User(models.Model): name = models.CharField(max_length...其实现在的ORM框架基本都提供了解决的方案,比如Django中,对这类问题就是通过select_related来解决。...上面的代码直接改造为: posts_with_user = Post.objects.all().select_related('user) 这样产生的语句就是上面的那个JOIN语句。...当然ORM还提供了其他类似的方法,比如prefetch_related,又是用来处理其他的问题。 总的来说,ORM给我们提供了便利,但某种程度上也对我们造成了限制,或者说是约束好了。

    67720

    django模型

    每个模型对 应数据库中唯一的一张表 如何编写模型 模型:每个模型都用一个类表示,该类继承自django.db.models.Model。...来表示随机排序 编写服务器模型 数据库迁移 迁移是Django用于同步你的发生改变的模型(添加一个字段,删除一个模型,等等)到你的 数据库 迁移命令 makemigrations, 负责基于你的模型修改创建一个新的迁移...从SQL 的角度,查询集和SELECT 语句等 价,过滤器是像WHERE 和LIMIT 一样的限制句。 你可以从模型的管理器那里取得查询集。...SQL WHERE 句的内容。...istartswith, iendswith in 在给定的列表内 字段查询 gt 大于 gte 大于等于 lt 小于 lte 小于等于 range 在指定范围内 year /month / day

    3.1K20
    领券