码迷,mamicode.com
首页 > 其他好文 > 详细

Django中ORM操作提升性能

时间:2019-11-24 19:24:12      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:models   括号   操作性   return   mode   time   适用于   需要   增加   

提升orm操作性能注意的点

 

优化一:尽量不查对象,能用values就是用values

直接使用对象查询的结果是5条sql语句

def youhua(request):
    # 使用对象查
    obj_list = models.Book.objects.all()
    for obj in obj_list:
        print(obj.title,obj.pubs.name)
        
    return render(request,"youhua.html")

技术图片

使用values查询只执行了1条sql,会自动进行连表查询

def youhua(request):
    # 使用values
    obj_list = models.Book.objects.values(title, pubs__name)
    for obj in obj_list:
        print(obj[title], obj[pubs__name])

    return render(request,"youhua.html")

技术图片

优化二:select_related(‘classes‘)

使用select_related(‘classes‘)

适用于:多对一 ,一对一查询添加select_related()方法,括号中是外键字段 。会进行连表查询

def youhua(request):
    # 使用对象查
    obj_list = models.Book.objects.all().select_related(pubs)
    for obj in obj_list:
        print(obj.title, obj.pubs.name)

    return render(request,"youhua.html")

技术图片

使用prefetch_related(),多对一,

def youhua(request):

    obj_list = models.Book.objects.all().prefetch_related("pubs")
    for obj in obj_list:
        print(obj.title,obj.pubs.name)

    return render(request,"youhua.html")

技术图片

使用prefetch_related(),多对多,

def youhua(request):

    obj_list = models.Book.objects.all()
    for obj in obj_list:
        print(obj.title,obj.authors.all())

    return render(request,"youhua.html")

技术图片

def youhua(request):

    obj_list = models.Book.objects.all().prefetch_related("authors")
    for obj in obj_list:
        print(obj.title,obj.authors.all())

    return render(request,"youhua.html")

技术图片

优化四:only()指定查询字段

直接查询的情况,会将所有字段都查询出来

def youhua(request):

    obj_list = models.Book.objects.all()
    for obj in obj_list:
        print(obj.title)

    return render(request,"youhua.html")

技术图片

查询时指定某些字段查询,使用only指定字段只会查我们需要的那个字段。

def youhua(request):

    obj_list = models.Book.objects.all().only(title)
    for obj in obj_list:
        print(obj.title)

    return render(request,"youhua.html")

技术图片

优化五:defer() 查询时指定排除某些字段和only相反

如果我们需要的字段较多,不需要的较少,可以使用defer排除

def youhua(request):

    obj_list = models.Book.objects.all().defer(title)
    for obj in obj_list:
        print(obj.pubtime)

    return render(request,"youhua.html")

注:如果排除的字段,还要查会增加查询负担,当然查询指定字段之外的字段也会增加查询负担。

Django中ORM操作提升性能

标签:models   括号   操作性   return   mode   time   适用于   需要   增加   

原文地址:https://www.cnblogs.com/qianniao2122/p/11923431.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!