• Django-select_related优化查询


    对于一对一字段(OneToOneField)和外键字段(ForeignKey),可以使用select_related 来对QuerySet进行优化。
    
    select_related 返回一个QuerySet,当执行它的查询时它沿着外键关系查询关联的对象的数据。它会生成一个复杂的查询并引起性能的损耗,但是在以后使用外键关系时将不需要数据库查询。
    
    简单说,在对QuerySet使用select_related()函数后,Django会获取相应外键对应的对象,从而在之后需要的时候不必再查询数据库了。
    
    下面的例子解释了普通查询和select_related() 查询的区别。
    
    查询id=2的文章的分类名称,下面是一个标准的查询:
    obj = models.Article.objects.get(id=2)
    print(obj.classify.title)   #走两次数据库,基于对象的属于子查询,基于双下划线的属于连表查询

    如果加上select_related函数就会是这样的

    articleList=models.Article.objects.select_related("category").all()
       
     
        for article_obj in articleList:
            #  Doesn't hit the database, because article_obj.category
            #  has been prepopulated in the previous query.
            print(article_obj.category.title)
    
    
    #查询所有书的分类标题
    obj_list=models.Article.objects.select_related("user").select_related("classify").all()
    for obj in obj_list:
        print(obj,"2222222",type(obj))
        print(obj.classify.title)
    
    # obj_list = models.Article.objects.select_related("user","classify").all()
    # for obj in obj_list:
    #     print(obj.classify.title)
    # 要看需求查的数据多不多,如果一次的话就没有必要了
    部分总结:
    1、select_related主要针一对一和多对一关系进行优化。
    2、select_related使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能。
    3、可以通过可变长参数指定需要select_related的字段名。也可以通过使用双下划线“__”连接字段名来实现指定的递归查询。
    4、没有指定的字段不会缓存,没有指定的深度不会缓存,如果要访问的话Django会再次进行SQL查询。
    5、也可以通过depth参数指定递归的深度,Django会自动缓存指定深度内所有的字段。如果要访问指定深度外的字段,Django会再次进行SQL查询。
    6、也接受无参数的调用,Django会尽可能深的递归查询所有的字段。但注意有Django递归的限制和性能的浪费。
    7、Django
    >= 1.7,链式调用的select_related相当于使用可变长参数。Django < 1.7,链式调用会导致前边的select_related失效,只保留最后一个。
  • 相关阅读:
    为App签名(为apk签名)
    Android如何获取网络连接状态(3G/Wifi)及怎样调用网络配置界面
    android textview改变部分文字的颜色和string.xml中文字的替换及部分内容设置颜色、字体、超链接、图片
    Toast和Looper。Handler消息循环机制
    android 创建DateTime类型的数据库
    Android中dp和px之间进行转换
    Java的ThreadPoolExecutor使用几点建议
    ListView中设置item点击状态的背景色
    android 让一个控件按钮居于底部的几种方法
    sqlite3数据类型和函数
  • 原文地址:https://www.cnblogs.com/52-qq/p/8532508.html
Copyright © 2020-2023  润新知