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

Django select_related链接的外键不返回非直接相关的对象

Django中的select_related是一个查询优化方法,用于在查询数据库时减少查询次数,提高性能。它通过在查询时预先将相关对象的数据一起获取,避免了多次查询数据库的开销。

select_related方法可以用于查询外键关联的对象,但默认情况下只返回直接相关的对象。也就是说,如果有多层级的外键关系,select_related只会返回第一层级的对象,而不会返回非直接相关的对象。

举个例子,假设有三个模型:A、B和C,它们之间的关系是A与B是一对一关系,B与C是一对一关系。如果我们使用select_related('b')查询A对象,并且A对象与C对象有关联,那么默认情况下,select_related只会返回A对象和与之直接相关的B对象,而不会返回C对象。

如果我们需要获取非直接相关的对象,可以使用select_related的双下划线语法。例如,select_related('b__c')可以获取A对象、与之直接相关的B对象以及与B对象直接相关的C对象。

Django官方文档中关于select_related的详细介绍可以参考: https://docs.djangoproject.com/en/3.2/ref/models/querysets/#select-related

在腾讯云的产品中,与Django的select_related功能相关的产品可能是腾讯云数据库(TencentDB)。TencentDB是一种高性能、可扩展的云数据库服务,可以提供与Django应用程序的数据库交互所需的存储和查询功能。您可以通过以下链接了解更多关于腾讯云数据库的信息: https://cloud.tencent.com/product/cdb

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

django模型中有关系表删除相关设置

0904自我总结 django模型中有关系表删除相关设置 一.一对一 例如有Author、AuthorDetail两表 author = models.OneToOneField(to='Author...):出版社删除书不动,书删除没有任何影响 2)出版社找书用 related_name(books),书找出版社 字段(publish) 3)db_constraint断开表关联,on_delete...models.DO_NOTHING为删除级联关系, models.CASCAD为级联关系,'SET_NULL'置空,SET_DEFAULT设为默认值 两者区别 models.SET关联表内容删了,关联相关内容不会删除...models.CASCAD关联表内容删了,关联相关内容会删除 db_constraint关系断开后,但是不影响联表查询 四.多对多关系 例如Book、Author两表 authors = models.ManyToManyField...,反向找 字段related_name 3)db_constraint断开表关联,on_delete不存在(设置,本质在第三张表中设置,且一定是级联)

3K20

django select_related和prefetch_related用法与区别

for循环每运行一次,django都要对数据库进行一次查询,造成了极大资源浪费。为什么我们不能再第一次获取文章列表同时就获取每篇文章相关category和tags对象信息呢?...select_related方法 select_related将会根据关系(注意: 仅限单对单和单对多关系),在执行查询语句时候通过创建一条包含SQL inner join操作SELECT语句来一次性获得主对象相关对象信息...(‘author__name’).get(id=13) # 使用select_related()可返回所有相关主键信息。...我们对之前article_list视图函数再做进一步修改,在查询文章列表同时返回相关tags信息。...对与单对单或单对多ForeignKey字段,使用select_related方法 对于多对多字段和反向外关系,使用prefetch_related方法 两种方法均支持双下划线指定需要查询关联对象字段名

1.3K20

Django学习笔记之Queryset详解

,通过自定义modelinstance可以获取实体等,它方法都是记录级方法(都是实例方法,貌似无类方法),不要在里面定义类方法,比如计算记录总数,查看所有记录,这些应该放在自定义manager...Q对象Q查询混和使用,但不建议这样做,因为混和查询时Q对象要放前面,这样就有难免忘记顺序而出错,所以如果使用Q对象,那就全部用Q对象。...Q对象也很简单,就是把原来filter中各个条件分别放在一个Q()即可,不过我们还可以使用或与,分别对应符号为”|”和”&”和”~”,而且这些逻辑操作返回还是一个Q对象,另外,逗号是各组条件基本连接符...()——对应返回关联记录实体 原型select_related(*filed) 返回QuerySet 它可以指定返回哪些关联表model instance,这里field跟filter()中一样,...(),QuerySet中元素中OneToOne关联及对应是都是关联表一条记录,如my_entry=Entry.objects.get(id=1),my_entry.blog就是关联表一条记录对象

2.7K30

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

orm查询优化 1)only与refer ​ only方法返回是一个queryset对象,本质就是列表套数据对象 ​ 该对象内只含有only括号所指定属性(其他属性也可以获取,但是需要重新走数据库查询...) defer与only互为反关系,返回是一个queryset对象,本质就是列表套数据对象;该对象只含有除了defer括号内所指定属性(括号内属性也可以获取但是需要重新走数据库) 2)select_related...与prefetch_related select_related括号内只能放字段,并且字段类型只能是一对一或一对多,内部是联表操作,会将关联表与当前表直接拼接起来,然后再执行查询操作,返回结果也是一个...queryset,列表套数据对象,该数据对象获取当前表中数据或者关联表中数据,都不会再走数据库; prefetch_related 括号内外字段全部支持,内部是子查询,返回结果也是一个queryset...,对象自带编码 django能够识别; processData:false, # 浏览器不需要对数据进行任何处理 django能够识别对象普通键值对和文件对象,然后分别放到不同方法POST和FILES

1.6K10

DjangoDjango ORM 学习笔记

通过使用 ORM,我们只需要操作 Author 和 Blog 对象,而不用操作相关数据库表。这里主要介绍一下 Django ORM 相关使用。...将数据库表和对象模型关联,我们只需针对相关对象模型进行编码,无须考虑对象模型和数据库表之间转化,大大提高了程序开发效率。 方便数据库迁移。...关联大体上可以分为两种: 只有一个关联实例: 关联中包含表、OneToOneField,例如下图中 orm_blog 只与一个 orm_author 实例关联 有多个关联实例:关联中不含表...`id` ASC LIMIT 1 select_related 会沿着递归查询,例如上图中取表 1 实例时,会沿着将表 3 数据一块取出来。...aggregate: 针对所有记录调用聚合函数,返回一个 dict 对象,下面是使用示例: from django.db.models import Min from django.db.models

2.2K20

Django数据库查询优化与AJAX

第三范式(3NF):属性不依赖于其他主键属性,属性直接依赖于主键(冗余性) 不同属性之间不能有传递关系,也就是每一个属性数据不能相互影响。...与prefetch_related select_related 括号内只能放一对一、一对多字段,特点:内部自动连表操作,会将括号内外字段所关联表与当前表自动拼接成一张表,然后将表中数据一个一个查询出来封装成一个一个对象...这样做好处:跨表查询也不需要重复走数据库,减轻数据库压力。select_related()括号内放多个字段,逗号隔开,会将多个字段关联表与当前表拼成一张大表。...,特点:按步骤查询多张表,然后将查询结果封装到对象中,给用户感觉好像还是连表操作,括号内支持传多个字段,每放一个字段就会多走一条SQL语句,多查一张表。...Django内置serializers模块 前端想拿到通过orm查到一个个对象,(数据库里一条条记录),后端想把直接实例化出来对象发送给前端,这时候就需要用到Django给我们提供序列法方式(

2.4K20

浅谈优化Django ORM中性能问题

web端直接看到debug结果 案例 下面是用个具体例子来说明一些问题 model 定义 很经典关系, Author 和 Book 一对多关系 class Author(models.Model...如果后面需要 author对象,在获取也冲突。 比较好习惯是,直接使用字段名, 见下面的写法。...SQL一会为每行返回重复信息。 如果你进行一个查询,其中select_related 查询所有值都是相同,你就需要使用别的东西。...使用 author.books.all() 结合对象相关查询,Django会为每个已经查询book记录保存相同author对象 id(author) 4504693520 [(id(book.author...如果使用 对象相关查询,修改就能传播。 简单不一定更好 Django使得关系查询太容易了,这也带来了一些副作用。

1.7K30

07.Django学习之model进阶

简单使用 对于一对一字段(OneToOneField)和字段(ForeignKey),可以使用select_related 来对QuerySet进行优化。...select_related 返回一个QuerySet,当执行它查询时它沿着关系查询关联对象数据。它会生成一个复杂查询并引起性能损耗,但是在以后使用关系时将不需要数据库查询。...简单说,在对QuerySet使用select_related()函数后,Django会获取相应对应对象,从而在之后需要时候不必再查询数据库了。...nid"); 多查询 这是针对category查询,如果是另外一个呢?...Django >= 1.7,链式调用select_related相当于使用可变长参数。Django < 1.7,链式调用会导致前边select_related失效,只保留最后一个。

2K30

django这些查询技巧你会了吗?

2.如果书籍表 BookInfo 中还有,我们还想再关联查询那张表信息,可以用如下方式:hbook__键名称,之间用双下划线连接。...比如示例中可以改为:select_related(depth=1),它意思就是往下查询一层。如果书籍表中还有,我们都想查询出来,可以:select_related(depth=2),以此类推。...4.示例中方式是指定查询,只查询了英雄类中所关联图书。如果英雄类中有好几个,我们都想关联查询,参数 depth 优势就凸显出来了,不需要详细写出每一个名称。...你可能想到方法是查询出所有的英雄信息,然后遍历每个对象,将对象名称放到指定列表中,完成需求。...,此处为 hname ;第二个参数 flat 设置为 True 是为了不以元祖形式展示,而是直接将值取出来,形如: # 设置 flat 结果如下

58830

Django项目知识点(四)

values() 返回包含对象具体值字典QuerySet values_list() 与values()类似,只是返回是元组而不是字典。...tags = Tag.objects.only('name').filter(is_delete=False) values() only() 返回是queryset字典,不是对象,only才是返回对象...() 如果我要拿这个模型通过绑定另外一个模型,使用select_related course 模型定义了teacher字段绑定teacher模型 course = Course.objects.only...这样就可以引用模型字段值并使用它们执行数据库操作,而无需实际将它们从数据库中拉出到Python内存中 说白了就是我从数据库拿东西,但是有些需要字段没有,要通过绑定appmodel拿。...但是名称又是app__字段来命名,这样我要改名称,而且拿第一次model,放在python内存中,再拿通过绑定另一个model,又要执行第一次步骤,那个效率就不行了,干嘛我不一起拿,所以会用annotate

1.6K30

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

只有一个author属性连接一个. author__name是book下author属性下name,即book这个表通过访问到author这个表中name值。...如果在value中传递任何参数,那么会获取这个模型所有的值。返回还是一个字典。 6:values_list: 类似于values。只不过返回QuerySet中,存储不是字典,而是元组。...只能使用在设置了模型中(即只能在一对多模型上,不能多对一,多对多等),比如我们只在Book设置了author和publisher。...那么select_related里面只能传如这两个参数,而不能传入别的参数,如BookOrder,因为我们是在BookOrder中设置连接到Book,并没有在Book中设置连接到BookOrder...所以能使用select_related方法的话就是用这个方法。但是这两种方法执行效率都比传统方法执行效率高。传统方法就是先返回book对象,再通过book去查询对应相关信息。

3.6K20

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

首次对查询集进行求值 —— 同时发生数据库查询 ——Django 将保存查询结果到查询集缓存中并返回明确请求结果(例如,如果正在迭代查询集,则返回下一个结果)。...简单使用 对于一对一字段(OneToOneField)和字段(ForeignKey),可以使用select_related 来对QuerySet进行优化。...select_related 返回一个QuerySet,当执行它查询时它沿着关系查询关联对象数据。它会生成一个复杂查询并引起性能损耗,但是在以后使用关系时将不需要数据库查询。...简单说,在对QuerySet使用select_related()函数后,Django会获取相应对应对象,从而在之后需要时候不必再查询数据库了。...nid"); 多查询 这是针对category查询,如果是另外一个呢?

1.6K70

8个方法极速提高Django网站速度

借助于Django ORM提供一些高级功能,我们能够从某种程度上改善这种情况,将调用查询数据减少。 例如,我们可以借助select_related()查询集方法将涉及查询合并为一个查询。...下面是官方示例: 在正常情况下,我们可能需要使用两条数据库查询: # 先去数据库查Entry表 e = Entry.objects.get(id=5) # 再去数据库查询相关Blog对象 b =...七、减少返回数据字段 通常情况下,我们创建查询集都会直接发挥查询结果所有字段,但如果一个表里面有几十甚至上百个字段,而我们只需要其中几个,返回其他字段无疑会减缓数据传输速度。...其中: defer()方法:用于返回某字段以外所有查询对象内容; only()方法:用于仅返回某字段查询对象内容; values()方法:用于返回指定字段所有查询对象字典; values_list...()方法:用于返回指定字段所有查询对象元祖; 大家可以根据实际需要,灵活地使用这些查询集方法。

3.2K30

Web | Django 与数据库交互,你需要知道 9 个技巧

与其他阻塞应用程序服务器(如 Tornado,asyncio 甚至 Node)不同,Django 通常使用同步工作进程。...我们限制某一个查询返回超过 100 行数据: # bad example data = list(Sale.objects.all())[:100] 这很糟糕,因为虽然只返回 100 行数据,但是其实你已经把所有的行都取出来放进了内存...当 select_for_update 与 select_related 一起使用时,Django 将尝试获取查询中所有表锁。 我们用来获取事务代码尝试获取事务表、用户、产品、类别表锁。...索引(FK Indexes) 创建模型时,Django 会在所有上创建一个 B-Tree 索引,它开销可能相当大,而且有时候并不很必要。...回到文档: ...列与表格内物理位置有一些自然相关性 这是 BRIN 索引关键。为了充分利用它,列中值必须大致排序或聚集在磁盘上。

2.8K40

Django-官网查询部分翻译(1.11版本文档)-QuerySet-字段查找-06

目录 Making queries 进行查询 创建一个对象(一条数据记录) 保存修改对象 保存字段或多对多字段(ForeignKey or ManyToManyField fields) Retrieving...保存字段或多对多字段(ForeignKey or ManyToManyField fields) 字段 ForeignKey 更新一个字段写法和普通字段完全一致,只需要将正确类型对象分配给相关字段即可...(对象赋值给字段) entry.save() # 调用 .save() 方法 ManyToManyField 想要保存多对多字段,写法和字段有点小区别,使用 .add() 方法来记录一个关系。...对象方法 下面这些 QuerySet 方法会直接触发数据库操作然后返回一些其他东西,而不是 QuerySet 这些方法不会使用 cache 缓存,相反,每次调用他们都会执行数据库操作 # 常见几个...--> 推测是 遍历、取值,翻译成取值好像更合适一点) alias 别名 特别点 保存字段那里,可以直接对象赋值一个对象(blog 对象 --> blog 属性) cache

2.9K20

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

Django 中,你可以使用单行查询来获取关联模型数据。...下面是一些示例:1、问题背景在 Django 中,我们经常需要查询关联模型数据。传统方法是使用关系来获取关联模型数据,这需要进行两次数据库查询。...2、解决方案Django 提供了多种方法来进行单行查询,其中最常见方法是使用 select_related() 和 prefetch_related()。...2.1 使用 select_related()select_related() 可以将关联模型数据直接加载到主模型中,这样就可以在一次数据库查询中获取到所有需要数据。...2.3 代码例子以下是一个完整代码例子,演示如何使用 select_related() 和 prefetch_related() 来获取关联模型数据:from django.db.models import

7110

提升Django性能数据库优化与ORM调优技巧详解

在开发基于DjangoWeb应用程序时,数据库是至关重要组成部分之一。DjangoORM(对象关系映射)为开发者提供了便利,使得与数据库交互变得简单且直观。...# 返回要读取数据库 pass def db_for_write(self, model, **hints): # 返回要写入数据库 pass...使用缓存服务 除了Django内置缓存机制,还可以使用专门缓存服务如Redis来提高数据访问速度和降低数据库负载。Redis支持更复杂数据结构和操作,能够更灵活地应对各种场景。...这样可以减少连接创建和销毁开销,提高数据库访问效率。 SQL优化 除了使用ORM进行数据操作,有时直接执行SQL语句可能更高效。但是,在执行原生SQL语句时需要注意防止SQL注入攻击。...为了避免影响正常请求处理,可以考虑使用异步任务,并将这些任务调度到高峰时段执行。这样可以降低对数据库负载,提高系统稳定性和性能。

21520
领券