1、主要用于一对一、一对多关系的优化
class Province(models.Model):
name = models.CharField(max_length=10)
class City(models.Model):
name = models.CharField(max_length=5)
province = models.ForeignKey(Province)#province是字段名
class Person(models.Model):
firstname = models.CharField(max_length=10)
lastname = models.CharField(max_length=10)
visitation = models.ManyToManyField(City, related_name = "visitor")
hometown = models.ForeignKey(City, related_name = "birth")
living = models.ForeignKey(City, related_name = "citizen")
2.对于一对一字段(OneToOneField)和外键字段(ForeignKey),可以使用select_related 来对QuerySet进行优化,在对QuerySet使用select_related()函数后,Django会获取相应外键对应的对象,从而在之后需要的时候不必再查询数据库了。
3.select_related() 接受可变长参数,每个参数是需要获取的外键(父表的内容)的字段名,以及外键的外键的字段名、外键的外键的外键…。若要选择外键的外键需要使用两个下划线“__”来连接。
以上例说明,如果我们需要打印数据库中的所有市及其所属省份,使用select_related的做法是:
citys = City.objects.select_related('province').all()
for p in citys:
print(p.province)
我们要获得张三的现居省份,可以用如下方式:(张三的外键是city,city的外键是province,即外键的外键,要用双下划线__)
zhangs = Person.objects.select_related('living__province').get(firstname=u"张",lastname=u"三")
print(zhangs.living.province)
在本例中,如果要同时获得张三的故乡和现居地的省份:
>>> zhangs = Person.objects.select_related('hometown__province').select_related('living__province').get(firstname=u"张",lastname=u"三")
>>> zhangs.hometown.province
>>> zhangs.living.province