• 82.常用的返回QuerySet对象的方法使用详解:all,select_related


    1. all: 返回这个ORM模型的QuerySet对象。

    articles = Article.objects.all()
    print(articles)
    
    from django.http import HttpResponse
    from .models import Article, Category
    
    
    def index(request):
    # 使用select_related()方法提取相关联的数据表中的数据,会暂时的存放在内存中,
    # 再次查看的时候就不用再次访问数据库表了,可以大大提高访问的效率
    articles = Article.objects.select_related('category')
        for article in articles:
            print(article.category.name)
        print(connection.queries)
        return HttpResponse("success!")
    
    打印出结果如下:

    最新文章

    最新文章

    最热文章
    高评分文章

    [{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'}, {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'}, {'sql': 'SELECT article.id, article.title, article.content, article.category_id, article.create_time, category.id, category.name, category.rating FROM article LEFT OUTER JOIN category ON (article.category_id = category.id)', 'time': '0.000'}]

    同样也可以不放在内存中,但是这样django底层会执行更多的sql语句进行查询,示例代码如下:
    from django.http import HttpResponse
    from .models import Article, Category
    
    
    def index(request):
        articles = Article.objects.all()
        for article in articles:
            print(article.category.name)
        print(connection.queries)
        return HttpResponse("success!")
    
    返回的结果如下:

    最新文章

    最热文章
    高评分文章
    最新文章

    [{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'}, {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'}, {'sql': 'SELECT article.id, article.title, article.content, article.category_id, article.create_time FROM article', 'time': '0.000'}, {'sql': 'SELECT category.id, category.name, category.rating FROM category WHERE category.id = 1 LIMIT 21', 'time': '0.000'}, {'sql': 'SELECT category.id, category.name, category.rating FROM category WHERE category.id = 2 LIMIT 21', 'time': '0.000'}, {'sql': 'SELECT category.id, category.name, category.rating FROM category WHERE category.id = 3 LIMIT 21', 'time': '0.000'}, {'sql': 'SELECT category.id, category.name, category.rating FROM category WHERE category.id = 1 LIMIT 21', 'time': '0.000'}]

    由执行的sql语句可以看出,执行all()方法的sql语句会执行更多条,因此会降低查询的效率,所以可以在数据量不太大,并且查询的次数较多的时候,可以使用select_related方法将相关联的数据表中的数据提取到内存中,以便之后加快查询的效率。

    注意:这个方法只能用在定义了外键的字段上,也可以说是用在外键的关联对象(表)上,对于多对多,或者是多对一的情况,不能使用select_related()方法。而应该使用“prefetch_related”来实现。

    始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
  • 相关阅读:
    【我所认知的BIOS】—> uEFI AHCI Driver(4) — 第一个Protocol真难搞
    IOS Core Animation Advanced Techniques的学习笔记(四)
    Redhat 7改动默认执行级别方法 --RHEL7使用systemd创建符号链接指向默认执行级别
    CF1088F Ehab and a weird weight formula
    2018-2-13-win10-uwp-csdn-博客阅读器
    2018-2-13-win10-uwp-csdn-博客阅读器
    2018-2-13-win10-UWP-九幽数据分析
    2018-2-13-win10-UWP-九幽数据分析
    2019-9-2-win10-uwp-获得焦点改变
    2019-9-2-win10-uwp-获得焦点改变
  • 原文地址:https://www.cnblogs.com/guyan-2020/p/12268467.html
Copyright © 2020-2023  润新知