上篇文章说到了django 一对多的关系,里面说到了子类获取父类的对象的问题,直接用子类.子类关联父类的外键就可以访问父类的数据了,但是
这个有个问题,如果你要提高程序的效率,就应该尽量的少去查询数据库。
比如还是上篇文章的例子吧。
class Person(models.Model);
name = models.CharField('作者姓名', max_length=10)
age = models.IntegerField('作者年龄')
class Book(models.Model):
person = models.ForeignKey(Person, related_name='person_book')
title = models.CharField('书籍名称', max_length=10)
pubtime = models.DateField('出版时间')
比如我得到一个book对象,然后我想得到book对象的主表person的信息的话:
p = book.person
假设你想获取作者的姓名:
p.name
或者作者的年龄:
p.age
那其实是等于查询了两次数据库,对于要求效率比较高的朋友来说可能就不符合你的要求,有什么好的办法可以解决的吗?
答案就在今天说的django select_related()
还是拿上面的例子来说吧。
b = Book.objects.select_related().get(id=4)
p = b.name # 没有查询数据库
c = p.age # 没有查询数据库
而:
b = Book.objects.get(id=4) # No select_related() in this example.
p = b.name # 查询了数据库.
c = p.age # 查询了数据库.
你也可以控制查询缓存的深度。
b = Book.objects.select_related(depth=1).get(id=4)
p = b.name # 没有查询数据库
c = p.age # 查询了数据库.
通过上面的例子,你应该大体的明白django select_related()的作用吧,我感觉django select_related()有点像一种缓存的结构,
把外键的记录一起查询出来,然后放到记录集里,等到下次要用数据的时候就不用再查询数据库了,直接从缓存的记录集里去拿数据。
不过任何事物都有两面性,上面说到了它有利的方面,我大概说说不好的方面,我感觉它既然缓存记录的话,那对于时效性比较强的应用
来说可能就不合适了,数据可以不能及时的被更新,django的有些机制处理还是很不错的,比如: [django template 语法],[django template extends] , [django template filter]
原创文章请注明转载自老王python,本文地址:http://www.cnpythoner.com/post/137.html
作者:老王@python python 教程
老王python,提供python相关的python 书籍,python 主机,django 教程和python 下载,希望大家能够喜欢!
分享到:
相关推荐
在Django框架中,`select_related()` 和 `prefetch_related()` 是两个非常重要的查询优化工具,它们可以帮助我们提高数据检索的效率,降低数据库查询次数,从而提升应用性能。本篇文章将详细探讨这两个方法的工作...
自动相关AutoRelated软件包会自动为django-rest序列化程序正确使用django的select_related select_related() , prefetch_related()和only()方法。 将序列化器传递给Tracer对象使用返回的参数构建查询您的查询已优化...
主要介绍了利用Python的Django框架中select_related和prefetch_related函数对数据库查询的优化的一个实践例子,展示如何在实际中利用这两个函数减少对数据库的查询次数,需要的朋友可以参考下
为了解决这一问题,Django提供了`select_related()`函数,用于优化对QuerySet查询的性能。 `select_related()`的主要目的是减少数据库的查询次数。在上述实例中,我们有一个个人信息系统,其中包含Province、City和...
本文将深入探讨Django Model中`select`的各种用法,并通过与MySQL的查询语句对比,帮助开发者更好地理解和应用这些功能。 ### 基本操作 1. **获取所有数据**:`User.objects.all()` 对应于 SQL 的 `select * from ...
Django的查询集提供了方便的关联查询方法,如`related_name`和`prefetch_related`,这些方法在处理关联模型时能大幅提升性能。 此外,了解索引和其对查询性能的影响也是重要的。在Django中,你可以通过模型字段的`...
可以通过select_related或prefetch_related来解决这个问题。 4. 使用.values()和.values_list()方法来减少数据传输量,这种方法只获取需要的字段值,而不是整个对象。 5. 使用F表达式和Q对象来进行复杂的查询。F...
Django的select_related django prefetch_related 该项目使用以下工具: django-cacheops django-url-filter drf-renderer-xlsx 休息许可 运行这个项目 该项目使用docker在不同的环境中运行: 安装泊坞窗 克隆...
- **减少查询次数**:避免在循环中进行数据库查询,尝试批量获取数据或使用`select_related()`和`prefetch_related()`来减少额外的JOIN操作。 - **利用数据库索引**:为频繁查询的字段添加索引,提升查询速度。但要...
例如,新增了`prefetch_related`和`select_related`查询优化方法,这两个方法可以预先加载关联数据,减少数据库查询次数,从而提高应用程序的性能。 在表单(Form)处理上,Django 2.1提供了更好的错误处理机制,...
在上述示例中,使用`Article.objects.select_related('category')`会将文章和其关联的分类信息一并获取。 - `prefetch_related()`:这会进行预加载,先获取所有文章,然后一次性获取所有分类信息。例如,`Article....
例如,`select_related()` 和 `prefetch_related()` 的性能有所提升,降低了数据库操作的次数。 9. **国际化和本地化**:Django 2.0 在国际化和本地化方面也有改进,包括对时间区域的支持,以及更强大的翻译字符串...
总之,Django ORM查询性能优化涉及多个方面,包括基础查询操作的优化、外键的谨慎使用、利用F表达式和Q对象构造复杂查询,以及利用`select_related()` 和 `prefetch_related()` 减少数据库交互。结合数据库设计、...
8. **其他小改进**:还有许多其他的小改进,如`get_object_or_404`和`get_list_or_404`函数现在支持`QuerySet`的`select_related`和`prefetch_related`方法,这能提高数据检索的效率。 在安装Django 2.0时,确保你...
这里使用Django的`Dynamic.objects.select_related('song').order_by('-dynamic_search').all()[:4]`来获取搜索次数最多的前4首歌曲。`select_related()`方法用于优化数据库查询,确保在获取相关模型数据时只进行一...
- 为提高性能,可以在数据库查询时只获取需要的字段,避免使用`select_related()`和`prefetch_related()`。 - 对于大型项目,考虑使用缓存机制,如Memcached或Redis,减少数据库压力。 - 分页库的选择并非唯一,...