分享django select_related()的一点心得
子类获取父类的对象的问题,直接用子类.子类关联父类的外键就可以访问父类的数据了,但是
这个有个问题,如果你要提高程序的效率,就应该尽量的少去查询数据库。
比如还是上篇文章的例子吧。
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
龙欣SEO 第 2 页 2013-4-13
假设你想获取作者的姓名: 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)
龙欣SEO 第 3 页 2013-4-13
p = b.name # 没有查询数据库 c = p.age # 查询了数据库.
通过上面的例子,你应该大体的明白django select_related()的作用吧,我感觉django select_related()有点像一种缓存的结构,
把外键的记录一起查询出来,然后放到记录集里,等到下次要用数据的时候就不用再查询数据库了,直接从缓存的记录集里去拿数据。 不过任何事物都有两面性,上面说到了它有利的方面,我大概说说不好的方面,我感觉它既然缓存记录的话,那对于时效性比较强的应用 来说可能就不合适了,数据可以不能及时的被更新,django的有些机制处理还是很不错的,比如: [django template 语法],[django template extends] , [django template filter] 想要了解更多python教程,可以上 老王python: http://www.cnpythoner.com
因篇幅问题不能全部显示,请点此查看更多更全内容