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

django如何使用prefetch_related()来获取外键的related_name

在Django中,可以使用prefetch_related()方法来获取外键的related_name。

prefetch_related()是Django ORM中的一个查询优化方法,用于在查询时一次性获取相关对象的数据,而不是每次访问外键属性时都进行额外的数据库查询。

使用prefetch_related()方法获取外键的related_name,需要按照以下步骤进行操作:

  1. 在查询中使用prefetch_related()方法,并传入外键的related_name作为参数。例如,如果有一个模型A与模型B存在外键关系,其中related_name为"b_set",则可以使用以下代码来获取A对象及其关联的B对象:
  2. 在查询中使用prefetch_related()方法,并传入外键的related_name作为参数。例如,如果有一个模型A与模型B存在外键关系,其中related_name为"b_set",则可以使用以下代码来获取A对象及其关联的B对象:
  3. 在视图或模板中使用获取到的查询结果。通过prefetch_related()方法,Django会在查询时一次性获取A对象及其关联的B对象的数据,可以直接通过A对象的related_name属性来访问关联的B对象。例如,在模板中可以使用以下代码来展示A对象及其关联的B对象:
  4. 在视图或模板中使用获取到的查询结果。通过prefetch_related()方法,Django会在查询时一次性获取A对象及其关联的B对象的数据,可以直接通过A对象的related_name属性来访问关联的B对象。例如,在模板中可以使用以下代码来展示A对象及其关联的B对象:

prefetch_related()方法的优势在于减少了数据库查询的次数,提高了查询性能。它适用于需要获取外键关联对象的场景,特别是在遍历多个对象及其关联对象时,可以显著减少数据库查询的次数。

对于腾讯云相关产品和产品介绍链接地址,可以参考腾讯云官方文档或官方网站获取更详细的信息。

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

相关·内容

Django(ForeignKey)操作以及related_name作用

之前已经写过一篇关于Django文章,但是当时并没有介绍如何根据对数据操作,也就是如何通过主表查询子表或者通过子表查询主表信息 首先我定义了两个模型,一个是老师模型,一个是学生模型,...,并获取老师相关信息 返回一个teacher对象,接下来就是查询teacher相关联学生对象,在这里有一个需要注意点,django默认情况下每一个主表对象都有一个是属性,可以通过它查询到所有关于子表信息...,在models.py使用Foreign定义时候也可以传入一个参数related_name,操作如下: 执行python manage.py makemigrations 和 python manage.py...migrate 从上图可以看到和之前_set操作效果是一样,这两个方法是相同,所以如果觉得比较麻烦的话,可以在定义主表时候,直接就给定义好名称使用related_name...上面的查询主要是通过主表查询子表信息 下面说一下如何通过子表查询主表相关信息,也就是查询一个学生所对应老师信息 首先需要先获取一个子表对象,那么就可以通过定义时候那个字段名获取关于主表信息了

2K10

django select_related和prefetch_related用法与区别

今天我们再来学习两个非常重要查询方法select_related和prefetch_related方法,看看如何使用它们避免不必要数据库查询。高手过招,只差分毫。...Django考虑到了这一点,所以提供select_related和prefetch_related方法提升数据库查询效率,类似于SQLJOIN方法。...select_related方法 select_related将会根据关系(注意: 仅限单对单和单对多关系),在执行查询语句时候通过创建一条包含SQL inner join操作SELECT语句一次性获得主对象及相关对象信息...Django提供了prefect_related方法解决这个问题。prefect_related可用于多对多关系字段,也可用于反向外关系(related_name)。...对与单对单或单对多ForeignKey字段,使用select_related方法 对于多对多字段和反向外关系,使用prefetch_related方法 两种方法均支持双下划线指定需要查询关联对象字段名

1.3K20

Django ORM:天使与魔鬼 II

Django 中我们通常会使用 selected_related 或prefetch_related 预取关联对象,减少和 DB 之间交互,但是在使用上也需要有一些注意地方。...Django 默认查询方式都是粗放,例如普通查询不使用 values 或者 only 时都是 select * ,而预取也不例外,看看下面这个例子。...() ,默认地 Django 会将所有关联字段都取出来,加入 Baz 表无比巨大,本来用作性能优化 prefetch_related 就会摇身变成耗时怪兽。....prefetch_related("bars__bazs") 此时二级预取也是默认获取全部字段,倘若 Baz 表中有一个需要额外耗时序列化字段,同样会使优化适得其反。...在我看来,ORM 能让 90% 查询都变得结构化更清晰、更易维护、甚至更安全,但剩下 10% 也许会耗费更多精力,所以何时使用 ORM 是根据具体项目场景,不能因噎废食。

69750

django序列化时使用真实值操作

展示: 一般情况下序列化得到内容只是id: ... { fields: { uat_date: "2015-07-25", statu: "CG", name: "慢赢优化",...方法: 我序列化是Content表,它含有一个关联是Module表,1对多 我要先序列化Module表,然后序列化Content表时候才可以使用到Module真实值 class ModuleManager...jsons = serializers.serialize(‘json’, queryset,use_natural_foreign_keys=True) 附: 如果要给Content表序列化,那么要使用到外...actual_key,要保证先序列化,如下依赖: class Content(models.Model): name = models.CharField(max_length=100) ......,这种方法并不常用 在有特定需要时候,使用这种django原生序列化,还是十分方便

1.8K10

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

要避免在遍历数据同时产生queryset cache,可以使用iterator()方法 获取数据,处理完数据就将其丢弃。...对于一对一字段(OneToOneField)和字段(ForeignKey),可以使用select_related 对QuerySet进行优化。...select_related 返回一个QuerySet,当执行它查询时它沿着关系查询关联对象数据。它会生成一个复杂查询并引起性能损耗,但是在以后使用关系时将不需要数据库查询。...简单说,在对QuerySet使用select_related()函数后,Django获取相应对应对象,从而在之后需要时候不必再查询数据库了。...nid"); 多查询 这是针对category查询,如果是另外一个呢?

1.6K70

07.Django学习之model进阶

要避免在遍历数据同时产生queryset cache,可以使用iterator()方法 获取数据,处理完数据就将其丢弃。...对于一对一字段(OneToOneField)和字段(ForeignKey),可以使用select_related 对QuerySet进行优化。...select_related 返回一个QuerySet,当执行它查询时它沿着关系查询关联对象数据。它会生成一个复杂查询并引起性能损耗,但是在以后使用关系时将不需要数据库查询。...简单说,在对QuerySet使用select_related()函数后,Django获取相应对应对象,从而在之后需要时候不必再查询数据库了。...nid"); 多查询 这是针对category查询,如果是另外一个呢?

2K30

Django---ORM操作大全

,翻译成对应sql语句;所有使用Django开发项目无需关心程序底层使用是MySQL、Oracle、sqlite.......=publish_obj) book_obj.save() 多对多 如果两表之间存在双向1对N关系,就无法使用描述其关系了; 只能使用多对多方式,新增第三张表关系描述表...','ug_id','ug__title')    #注意正向连表是  __列 反向是小写表名 3....小写表名 得到有关系列 #因为使用values取值取得是字典不是对象,所以需要 小写表名(表)__ v = UserGroup.objects.values('id'...:结果都对象是 原理:虽好,但是做连表操作依然会影响查询性能,所以出现prefetch_related prefetch_related:不做连表,多次单表查询表 去重之后显示, 2次单表查询(有几个做几次

6.8K100

Django学习笔记之Queryset详解

,通过自定义modelinstance可以获取实体等,它方法都是记录级方法(都是实例方法,貌似无类方法),不要在里面定义类方法,比如计算记录总数,查看所有记录,这些应该放在自定义manager...先filter,然后对得到QuerySet执行delete()方法就行了,它会同时删除关联它那些记录,比如我删除记录表1中A记录,表2中B记录中有A,那同时也会删除B记录,那ManyToMany...中实现 在SQL中,很多关键词在删、改、查时都是可以用,如order by、 like、in、join、union、and、or、not等等,我们以查询为例,说一下django如何映射SQL这些关键字...fields passed to select_related(),QuerySet中元素中OneToOne关联及对应是都是关联表一条记录,如my_entry=Entry.objects.get...select_related是用select ……join返回关联表字段,而prefetch_related是用多条SQL语句形式查询,一般,后一条语句用IN调用上一句话返回结果。

2.7K30

浅谈优化Django ORM中性能问题

当你遇到选择清晰代码,还是牺牲清晰代码获取性能上一点点提高时候,请优先考虑要代码清晰整洁 工具 解决问题第一步是找到问题,面对 ORM,有时间事情可以做。...web端直接看到debug结果 案例 下面是用个具体例子来说明一些问题 model 定义 很经典关系, Author 和 Book 一对多关系 class Author(models.Model...如果后面需要 author对象,在获取也不冲突。 比较好习惯是,直接使用字段名, 见下面的写法。...意识到了这种问题,并提供 select_related 和 prefetch_related 解决。...Django ORM中关联查询非常好用,我们自然希望使用这种方式。在一个循环中,如果不使用 select_related 或者 prefetch_related,可能会导致几百个查询。

1.7K30

djangorelated_name用法说明

fruits = buyer.fruit_set.all() """ django 默认每个主表对象都有一个是属性,可以通过它查询到所有属于主表子表信息。...这个属性名称默认是以子表名称小写加上_set()表示,这里我们主表是buyer,字表是fruit,所以主表属性就是fruit_set """ 上面的fruit_set是django为对象buyer...默认创建属性,个人建议采用自定义方式定义主表,这样使用时更熟悉一些吧!...而related_name就实现这个功能,在字表中定义时,增加related_name字段指定这个字表在主表中对应属性, 如下: class Fruit(models.Model): buyer...100).first() #然后通过子表中自定义获取子表所有信息: fruits = buyer.buyer_fruit.all() 以上这篇djangorelated_name用法说明就是小编分享给大家全部内容了

2.3K20

Django——ContentType(与多个表建立关系)及ContentType-signals使用

可以看到,我们通过model_class就可以获取对应类。也就是说,今后,我们如果自己定义model如果有关联到這个ContentType上,我们就能找到对应model名称。...对于新鲜事这个功能来说就是使用GenericRelation产生一个特殊,它不像models.ForeignKey那样,必须指定一个Model来作为它指向对象。...怎么从这张操作记录表中得到相应操作model呢,这就得用到fields.GenericForeignKey,它是一个特殊,可以指向任何Model实例,在这里就可以通过这个字段指向类似Post...创建事件时候看到可以将post这个instance直接赋给generic.GenericForeignKey类型字段,从而event实例就可以通过它获取事件真正信息了。   ...总之,如果一个表与其他表有多个关系,我们可以通过ContentType解决这种关联。

4.3K20

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

orm查询优化 1)only与refer ​ only方法返回是一个queryset对象,本质就是列表套数据对象 ​ 该对象内只含有only括号所指定属性(其他属性也可以获取,但是需要重新走数据库查询...与prefetch_related select_related括号内只能放字段,并且字段类型只能是一对一或一对多,内部是联表操作,会将关联表与当前表直接拼接起来,然后再执行查询操作,返回结果也是一个...queryset,列表套数据对象,该数据对象获取当前表中数据或者关联表中数据,都不会再走数据库; prefetch_related 括号内外字段全部支持,内部是子查询,返回结果也是一个queryset...ajax如何发送json格式数据 需要在前端新增一个参数 contentType:’application/json’ 需要将数据序列化成json格式字符串 JSON.stringfy({...(‘name’,’value’) MyFormData.append(‘name1′,’value1’) MyFormData.append(‘name2′,’value2’) 文件数据 如何获取

1.6K10

Django(15)和表关系

大家好,又见面了,我是你们朋友全栈君。 删除操作 如果一个模型使用。那么在对方那个模型被删掉后,该进行什么样操作。可以通过on_delete指定。...那么将会获取SET函数中值来作为这个值。SET函数可以接收一个可以调用对象(比如函数或者方法),如果是可以调用对象,那么会将这个对象调用后结果作为值返回回去。...注意:以上这些选项只是Django级别的,数据级别依旧是RESTRICT! 表关系 表之间关系都是通过进行关联。而表之间关系,无非就是三种关系:一对一、一对多、多对多等。...这个OneToOneField其实本质上就是一个,只不过这个有一个唯一约束(unique key),实现一对一。 以后如果想要反向引用,那么是通过引用模型名字转换为小写形式进行访问。...并且FrontUser对象可以使用userextension来访问对应UserExtension对象。 如果不想使用Django默认引用属性名字。

2.1K40

Django数据库查询优化与AJAX

如: res = models.Book.objects.all()#只有当我们使用res时才会执行数据库查询操作 all、only与defer all 拿到自己所有的属性,但是没有与其他表建立属性...select_related 括号内只能放一对一、一对多字段,特点:内部自动连表操作,会将括号内外字段所关联表与当前表自动拼接成一张表,然后将表中数据一个一个查询出来封装成一个一个对象。...这样做好处:跨表查询也不需要重复走数据库,减轻数据库压力。select_related()括号内放多个字段,逗号隔开,会将多个字段关联表与当前表拼成一张大表。...,特点:按步骤查询多张表,然后将查询结果封装到对象中,给用户感觉好像还是连表操作,括号内支持传多个字段,每放一个字段就会多走一条SQL语句,多查一张表。...,更易理解 * JSON 使用 JavaScript 语法描述数据对象,但是 JSON 仍然独立于语言和平台。

2.3K20

python 终级篇 django --

也就是什么情况下使用管理对象---->>>> 它存在于下面两种情况: 关系反向查询 多对多关联关系 简单来说就是当 点后面的对象 可能存在多个时候就可以使用以下方法。...名称是聚合值标识符,值是计算出来聚合值。名称是按照字段和聚合函数名称自动生成出来。...如果我们要对两个字段值做比较,那该怎么做呢? Django 提供 F() 做这样比较。F() 实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段值。...和|  操作符以及使用括号进行分组编写任意复杂Q 对象。...对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()进行优化。

2.8K20

django rest framework serializers解读

常用field   CharField、BooleanField、IntegerField、DateTimeField这几个用得比较多,我们把field放到后面去说!...用法还相对简单一点,后面还会有比较复杂情况 关于serializers 讲了那么多,终于要研究一下啦~ 其实,field也比较简单,如果我们直接使用serializers.Serializer...id,并不能获取到详细信息,如果想要获取到具体信息,那需要嵌套serializer category = CourseCategorySerializer() 注意: 上面两种方式,都是正向取得...= CourseSerializer(many=True)  写到这里,我们就基本讲完了!...='sub_cat')  现在获取编程语言下课程,显然无法直接获取到python入门学习这个课程,因为它们两没有关系。

1.7K10

DRF中多对多ManytoMany字段更新和添加

orderId 是自动生成UUID订单区域是,下单人也是,菜品orderMenu是一个多对多字段(其实通过我查到方法说都是字段就可以实现但是个人觉得菜品和订单应该是多对多会比较好理解...Orderordercenterthough_set查找表传入查找字段并用data序列话出来 reason = OrderCenterThoughSerializer(instance.ordercenterthough_set.get...') # 获取传入过来多对多信息格式为[{},{}] # 我方法比较笨,理论上是可以传入多个就是在实例化时候添加many = True 标识,但是实在是没心思搞了...如果解决的话应该还是要加判断或者其他处理方法3、针对第二点解决方法个人认为如果有新菜品添加的话就要删除当前订单再重新添加这样逻辑应该就说通了,不过具体还要看使用需求。...主要是一个思路,drf ModelSerializer 和 ModelViewSet 封装太严实了,通过这样方法更新和添加多对多字段实属自己技术不成熟。

69720
领券