zoukankan      html  css  js  c++  java
  • 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”来实现。

    始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
  • 相关阅读:
    easyexcel快速入门
    9个Vue.js库
    9个你应该知道的顶级JavaScript库
    7个使用JavaScript构建数据可视化的实用工具库
    html 无缝轮播图完整代码
    JavaScript编程语言基础语法总结
    html布局 百分比自适应框架网页模板
    js、jQuery实现文字上下无缝轮播、滚动效果
    React中实现条件渲染的方法
    使用JavaScript / jQuery为网站创夜间/高亮模式
  • 原文地址:https://www.cnblogs.com/guyan-2020/p/12268467.html
Copyright © 2011-2022 走看看