zoukankan      html  css  js  c++  java
  • Django ORM 优化心得

    selected_related与prefetch_related方法的使用
    详细讲解了django相关的性能优化:https://mp.weixin.qq.com/s/U07oOF8t04H8jyNv0TMJFw

    一次查询所有需要的关联模型数据

    假设我们有一个文章(Article)模型,其与类别(Category)是单对多的关系(ForeignKey), 与标签(Tag)是多对多的关系(ManyToMany)。
    我们需要编写一个article_list的函数视图,以列表形式显示文章清单及每篇文章的类别和标签,你的模板文件可能如下所示

    #在模板里每进行一次for循环获取关联对象category和tag的信息,Django就要单独进行一次数据库查询,造成了极大资源浪费。如何进行解决呢?
    {% for article in articles %}
        <li>{{ article.title }} </li>
        <li>{{ article.category.name }}</li>
        <li>
            {% for tag in article.tags.all %}
                {{ tag.name }},
            {% endfor %}
        </li>
     {% endfor %}
    

    select_related方法用来(查询一对多关系)和prefetch_related方法(查询多对多关系)一次性从数据库获取单对多和多对多关联模型数据,
    这样在模板中遍历时Django也不会执行数据库查询了。

    # 仅获取文章数据 - Bad
     def article_list(request):
         articles = Article.objects.all()
         return render(request, 'blog/article_list.html',{'articles': articles, })
    
     # 一次性提取关联模型数据 - Good
     def article_list(request):
         articles = Article.objects.all().select_related('category').prefecth_related('tags')
         return render(request, 'blog/article_list.html', {'articles': articles, })
    
  • 相关阅读:
    Linux进程间通信分类 以及 pipe的原理实现
    单链表的快速排序
    再谈二分查找
    数据库范式
    二分查找法浅析
    C# Observer设计模式
    C# 交错数组浅析
    C语言初学 数学中带根号的复杂计算问题
    C语言初学 计算三角形面积问题
    C语言初学 简单定义圆的面积计算问题
  • 原文地址:https://www.cnblogs.com/Young-shi/p/15476498.html
Copyright © 2011-2022 走看看