zoukankan      html  css  js  c++  java
  • django的orm操作优化

    django的orm操作优化

    models.py

    from django.db import models
    
    class Author(models.Model):
        name = models.CharField(max_length=16)
        age = models.IntegerField()
    
    class Book(models.Model):
        authors = models.ManyToManyField('Author')
        pubs = models.ForeignKey("Publish",on_delete=models.CASCADE)
        title = models.CharField(max_length=32)
        pubtime = models.DateField()
    
    class Publish(models.Model):
        name = models.CharField(max_length=32)
    

    优化一:尽量不查对象,能用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")
    

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

  • 相关阅读:
    bzoj1607: [Usaco2008 Dec]Patting Heads 轻拍牛头
    bzoj1016: [JSOI2008]最小生成树计数
    bzoj1051: [HAOI2006]受欢迎的牛
    bzoj1003: [ZJOI2006]物流运输
    bzoj1079: [SCOI2008]着色方案
    bzoj1179: [Apio2009]Atm
    bzoj1877: [SDOI2009]晨跑
    bzoj1821: [JSOI2010]Group 部落划分 Group
    bzoj1305: [CQOI2009]dance跳舞
    bzoj1858: [Scoi2010]序列操作
  • 原文地址:https://www.cnblogs.com/liuweida/p/11803173.html
Copyright © 2011-2022 走看看