深入select_related与prefetch_related函数
原文:https://www.cnblogs.com/tuifeideyouran/p/4232028.html
在数据库有外键的时候,使用select_related()和prefetch_related()可以很好的减少数据库请求的次数,从而提高性能.
下面是数据库设计图

models.py如下:
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_length=5)
province = models.ForeignKey(Province)
def __unicode__(self):
return self.name
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")
def __unicode__(self):
return self.firstname + self.lastname
`province` 表中只有2条数据:湖北省和广东省,`city`表中只有三条数据:武汉市、十堰市和广州市
select_related()
对于一对一字段(OneToOneField)和外键字段(ForeignKey),可以使用select_related()来对QuerySet进行优化.
在对QuerySet使用select_related()函数后,Django会获取相应外键对应的对象,从而在之后需要的时候不必再查询数据库了。
一个例子:
>>> citys = City.objects.all()
>>> for c in citys:
... print c.province
这样会导致线性的SQL查询,SQL查询语句如下:
SELECT `city`.`id`, `city`.`name`, `city`.`province_id` FROM `city`;
SELECT `province`.`id`, `province`.`name` FROM `province` WHERE `province`.`id` = 1;
SELECT `province`.`id`, `province`.`name` FROM `province` WHERE `province`.`id` = 2;
SELECT `province`.`id`, `province`.`name` FROM `province` WHERE `province`.`id` = 1;
使用select_related()函数后

最低0.47元/天 解锁文章
7840

被折叠的 条评论
为什么被折叠?



