上篇文章说到了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视频教程