上篇文章说到了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 下载,希望大家能够喜欢!
分享到:
相关推荐
自动相关AutoRelated软件包会自动为django-rest序列化程序正确使用django的select_related select_related() , prefetch_related()和only()方法。 将序列化器传递给Tracer对象使用返回的参数构建查询您的查询已优化...
此演示项目适用于本文 。
主要介绍了利用Python的Django框架中select_related和prefetch_related函数对数据库查询的优化的一个实践例子,展示如何在实际中利用这两个函数减少对数据库的查询次数,需要的朋友可以参考下
主要介绍了Python的Django框架中的select_related函数对QuerySet查询的优化,以减少数据库的查询次数为目的,需要的朋友可以参考下
Django的select_related django prefetch_related 该项目使用以下工具: django-cacheops django-url-filter drf-renderer-xlsx 休息许可 运行这个项目 该项目使用docker在不同的环境中运行: 安装泊坞窗 克隆...
from django.db import models class Province(models.Model): name = models.CharField(max_length=10) def __unicode__(self): return self.name class City(models.Model): name = models.CharField(max_...
orm查询优化 1)only与refer ...2)select_related与prefetch_related select_related括号内只能放外键字段,并且外键字段的类型只能是一对一或一对多,内部是联表操作,会将外键关联的表与当前表直接拼接起
在大多数情况下,您将具有前向关系(某些东西的外键),并可以使用select_related在同一查询上获取该数据。 但是,在某些情况下,您不能以这种方式设计模型,而需要来自反向关系的数据(具有对象外键的模型)。 ...
Django应用程序提供了查询集密封功能,以强制正确使用only() / defer()和select_related() / prefetch_related() 。 安装 pip install django-seal 用法 # models.py from django . db import models from seal . ...
使用select_related可以提高一些数据库效率,但是最少需要一个查询,这对于使用大量读取的API来说是不幸的。 该项目用支持缓存的代理类替换了Django查询集,从而可以为读取请求提供零数据库请求(以检索实例)或一...
1. views.py 定义views视图函数,将数据存入字典。并用压缩为json格式,... article_comments = article_obj.comment_set.select_related() comment_dict = {} for i in article_comments: print('comments_id', i.
python入门到高级全栈工程师培训视频学习资料;本资料仅用于学习,请查看后24小时之内删除。 【课程内容】 第1章 01 计算机发展史 02 计算机系统 03 小结 04 数据的概念 ...16 Model操作之select_related以及...