`
m4774411wang
  • 浏览: 108153 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

django select_related()的应用

 
阅读更多

上篇文章说到了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 下载,希望大家能够喜欢!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics