当前位置: 首页 > wzjs >正文

驻马店网站建设价格上海装修公司投诉排行

驻马店网站建设价格,上海装修公司投诉排行,做网站工作量怎么算,如何建立公司自己的网站Django-ORM-prefetch_related 模型定义N1 查询问题示例 使用 prefetch_related 优化查询处理更复杂的查询示例:预取特定条件的书籍示例:预取多个关联字段 性能比较注意事项总结 通过 Author 和 Books 两个模型来理解 Django 的 prefetch_related 方法。 …

Django-ORM-prefetch_related

  • 模型定义
    • N+1 查询问题示例
  • 使用 prefetch_related 优化查询
  • 处理更复杂的查询
    • 示例:预取特定条件的书籍
    • 示例:预取多个关联字段
  • 性能比较
  • 注意事项
  • 总结

通过 AuthorBooks 两个模型来理解 Django 的 prefetch_related 方法。
探讨如何使用 prefetch_related 来优化查询,避免 N+1 查询问题,
并展示其在处理多对多关系和复杂查询中的强大功能。

模型定义

首先,假设我们有两个模型:AuthorBook。一个作者可以写多本书,一本书也可以有多个作者(多对多关系)。

from django.db import modelsclass Author(models.Model):name = models.CharField(max_length=100)def __str__(self):return self.nameclass Book(models.Model):title = models.CharField(max_length=100)authors = models.ManyToManyField(Author, related_name='books')def __str__(self):return self.title

N+1 查询问题示例

假设我们想要获取所有作者以及他们所写的书籍。
如果不使用 prefetch_related,可能会遇到 N+1 查询问题。

# 获取所有作者
authors = Author.objects.all()for author in authors:print(f"Author: {author.name}")for book in author.books.all():  # 每个作者都会触发一次数据库查询print(f"  Book: {book.title}")

问题分析:
• 第一次查询获取所有作者。
• 对于每个作者,执行一次查询来获取其书籍。
• 如果有 10 个作者,总共会执行 1 + 10 = 11 次查询。

使用 prefetch_related 优化查询

prefetch_related 可以显著减少查询次数。
它会在后台执行额外的查询,并将结果缓存起来,
以便在访问关联对象时不需要额外的数据库查询。

# 使用 prefetch_related 预取每个作者的书籍
authors = Author.objects.prefetch_related('books')for author in authors:print(f"Author: {author.name}")for book in author.books.all():  # 现在只执行两次查询print(f"  Book: {book.title}")

优化效果:
• 第一次查询获取所有作者。
• 第二次查询获取所有相关的书籍。
• Django 在 Python 层面将这些书籍分配给相应的作者。
• 总共只执行了 2 次查询,无论有多少个作者。

处理更复杂的查询

有时候,我们可能需要预取多个关联字段,或者对预取的数据进行过滤。
这时,可以使用 Prefetch 对象来实现更细粒度的控制。

示例:预取特定条件的书籍

假设我们只想预取每位作者最近出版的 5 本书:

from django.db.models import Prefetch# 定义一个 Prefetch 对象,过滤并限制预取的书籍数量
recent_books = Prefetch('books',queryset=Book.objects.order_by('-id')[:5], # 假设 id 越大,出版时间越近to_attr='recent_books'                     # 将预取的书籍存储在 author.recent_books 中
)authors = Author.objects.prefetch_related(recent_books)for author in authors:print(f"Author: {author.name}")for book in author.recent_books:  # 访问预取的书籍print(f"  Recent Book: {book.title}")

解释:
• 使用 Prefetch 对象,我们可以自定义预取的查询集。
to_attr 参数指定了预取的数据存储在模型实例的哪个属性中。
• 这样可以避免加载所有关联对象,只加载我们需要的部分。

示例:预取多个关联字段

如果 Author 模型还有其他关联字段,比如 editor,我们可以同时预取多个关联:

authors = Author.objects.prefetch_related('books','editor'  # 假设有一个 ForeignKey 字段 'editor'
)for author in authors:print(f"Author: {author.name}")for book in author.books.all():print(f"  Book: {book.title}")if author.editor:print(f"  Editor: {author.editor.name}")

性能比较

为了更直观地理解 prefetch_related 的性能优势,我们来看一个简单的性能对比:

import time# 不使用 prefetch_related
start_time = time.time()
authors = Author.objects.all()
for author in authors:for book in author.books.all():pass  # 模拟操作
end_time = time.time()
print(f"无 prefetch_related 查询次数: {end_time - start_time} 秒")# 使用 prefetch_related
start_time = time.time()
authors = Author.objects.prefetch_related('books')
for author in authors:for book in author.books.all():pass  # 模拟操作
end_time = time.time()
print(f"使用 prefetch_related 查询次数: {end_time - start_time} 秒")

预期结果:
• 不使用 prefetch_related 的情况下,查询时间会随着作者数量的增加而线性增长。
• 使用 prefetch_related 后,查询时间基本保持不变,因为关联数据的查询次数大大减少。

注意事项

  1. 适用场景prefetch_related 主要用于处理“多对多”和“一对多”关系。对于“一对一”或“外键”关系,通常使用 select_related 更为高效。

  2. 内存消耗:由于 prefetch_related 会将所有预取的数据加载到内存中,如果关联数据量非常大,可能会导致内存占用过高。因此,在处理大数据集时需要谨慎使用。

  3. 自定义查询:通过 Prefetch 对象,可以自定义预取的查询集,如过滤、排序或限制数量,从而进一步优化性能。

  4. 链式调用prefetch_related 可以与其他查询优化方法(如 filterexclude 等)结合使用,以满足复杂的查询需求。

总结

prefetch_related 是 Django ORM 提供的一个强大的查询优化工具,特别适用于处理多对多和一对多关系中的 N+1 查询问题。通过预先加载关联对象,prefetch_related 能够显著减少数据库查询次数,提高应用的性能。在使用时,需要根据具体的业务场景选择合适的预取策略,并注意内存消耗等问题,以达到最佳的优化效果。

希望通过以上的解释和示例,你对 django-prefetch_related 有了更深入的理解!

Django-ORM-prefetch_related

  • 模型定义
    • N+1 查询问题示例
  • 使用 prefetch_related 优化查询
  • 处理更复杂的查询
    • 示例:预取特定条件的书籍
    • 示例:预取多个关联字段
  • 性能比较
  • 注意事项
  • 总结


文章转载自:

http://H4jsg2Uz.ctrkh.cn
http://cFO7pQpv.ctrkh.cn
http://AwJMThj4.ctrkh.cn
http://pVhPL3u1.ctrkh.cn
http://kKTxMPB5.ctrkh.cn
http://XbdcMITH.ctrkh.cn
http://Sb9wgVtZ.ctrkh.cn
http://9emCsinc.ctrkh.cn
http://3VCgEBpB.ctrkh.cn
http://YxgW6Yeu.ctrkh.cn
http://hw8AWXF7.ctrkh.cn
http://aJge8rAe.ctrkh.cn
http://6UCncvQA.ctrkh.cn
http://fg4aRnzz.ctrkh.cn
http://JasF9Z6o.ctrkh.cn
http://75BjaBlT.ctrkh.cn
http://rCLoGPwG.ctrkh.cn
http://EHGuhSEI.ctrkh.cn
http://MmrIdv5r.ctrkh.cn
http://hu3fGjlZ.ctrkh.cn
http://O0iOsgnT.ctrkh.cn
http://7hOxEgkn.ctrkh.cn
http://WY6oRNVB.ctrkh.cn
http://Z0sHuvgs.ctrkh.cn
http://UaP379ru.ctrkh.cn
http://KGAFg6Zl.ctrkh.cn
http://MYWhtOGa.ctrkh.cn
http://QMQQMSYY.ctrkh.cn
http://jvSwfHR6.ctrkh.cn
http://rBFwoXr4.ctrkh.cn
http://www.dtcms.com/wzjs/642195.html

相关文章:

  • 电子商务网站建设的目标是什么意思电商品牌推广方案
  • 百度推广后台登录网站更换服务器对seo的影响
  • 文成做网站桂城网站建设制作
  • 系统优化工具东莞seo网络
  • 网站建设招标公示西安网站建设需要多少钱
  • 网站中做背景图片位置咋写深圳pc端网站开发
  • 优质网站建设方案app开发公司选择指南及误区
  • 钓鱼网站怎样做新闻发布会主持稿
  • 乌班图系统做网站wordpress 编辑代码
  • 自助建设wap网站如何介绍设计的网站
  • 快站app制作教程上海网页制作培训学校
  • 上海网站重庆本地新闻
  • 做网站需要后台吗iis网站服务被禁用
  • 湖南3合1网站建设企业网站怎样优化
  • iis搭建网站教程win10二维码生成器哪个好用
  • 做查询网站有哪些国外搜索引擎大全百鸣
  • wordpress添加支付淄博seo推广
  • 制作营销网站模板免费下载霍邱网站设计
  • wordpress主题 单栏知道一个网站怎么知道是谁做的百度优化
  • 漳州市城乡建设局网站6做网站服务怎么赚钱
  • 百元做网站免备案网站建站
  • 做网站推荐源创网络成都企业建设网站
  • 电子商城网站开发的背景自动化系统网站建设首选公司
  • 西城广州网站建设那个公司做网站
  • 本地linux做网站兰州做系统优化的公司
  • 做汤的网站有哪些网站功能怎么写
  • 门户网站宣传方案2022中国企业500强
  • 做网站 长南阳网站推广公司
  • 中国工程建设监理协会网站提高工作效率整改措施
  • 链接制作上海网站优化公司排名