select_related与prefetch_related django ORM查询速度优化

深入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()函数后

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天马行空波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值