django sql查询优化之 select_related()

在使用ORM时,难免会遇到sql的性能问题,今天分享给大家一个可以优化sql的技巧,使用django提供的select_related 功能做优化
class Question(models.Model):

    """
    问题表
    """
    user = models.ForeignKey(User,related_name="question",on_delete=models.CASCADE,verbose_name='问题提问者')
    title = models.CharField(max_length=255,verbose_name='标题')
    is_draft = models.BooleanField(default=True,verbose_name='是否是草稿')
    status = models.CharField(max_length=10,choices=(('open','开启'),('close','关闭')),default='open')
    content = MarkdownxField(verbose_name='内容')
      

比如我们在对Question表做查询时,如果我们的表中有外键,user字段就是外键关联,当我们在进行查询时例如:

Question.objects.filter(status=‘open’)

django将ORM语句翻译成SQL是这样的:

SELECT * FROM question WHERE question.status = ‘open’
SELECT * FROM user WHERE id = ‘1’

显而易见,django执行了两条sql语句,因为user字段是外键,需要查询。

但是我们如果想减少sql查询的次数,期望用一条sql语句就能查到question和对应的外键user的信息呢? 好消息是django提供了一个好方法供我们完成我们的想法,在ORM查询时加入一个方法即可,如下

Question.objects.filter(status=‘open’).select_related(‘user’);

再让我们看看翻译的sql语句是什么样的

SELECT * FROM question INNER JOIN user ON (question.user_id = user.id) WHERE question.status = ‘open’ ;

此时Django会使用内连查询,将我们question和user信息转为一行输出,减少了sql查询次数,如果我们的数据库有成千上万的数据,那么sql优化还是很显著的~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值