最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

django中的select_related和prefetch_related性能優(yōu)化分析

 更新時間:2024年07月17日 14:45:00   作者:半兩風  
這篇文章主要介紹了django中的select_related和prefetch_related性能優(yōu)化分析,本文給大家介紹的非常詳細,需要的朋友可以參考下

django中的ORM查詢,針對復雜的查詢,除了使用A.objects.filter(foreign_name__field)進行查詢外。還可以使用select_related 和prefetch_related,進行性能的優(yōu)化

select_related:

將會根據外鍵關系(注意: 僅限單對單和單對多關系),在執(zhí)行查詢語句的時候通過創(chuàng)建一條包含SQL inner join操作的SELECT語句來一次性獲得主對象及相關對象的信息

1、模型類創(chuàng)建

users/modes.py

from django.db import models
# Create your models here.
class UserInfo(models.Model):
    username = models.CharField(verbose_name='用戶名', max_length=225)
    def __str__(self):
        return self.username
    class Meta:
        db_table = 'userinfo'
class Tag(models.Model):
    name = models.CharField(verbose_name='標簽名稱', max_length=225)
    def __str__(self):
        return self.name
    class Meta:
        db_table = 'tag'
class Article(models.Model):
    title = models.CharField(verbose_name='標題', max_length=225)
    content = models.CharField(verbose_name='內容', max_length=225)
    # 外鍵
    username = models.ForeignKey(verbose_name='用戶', to='UserInfo', on_delete=models.DO_NOTHING)
    tag = models.ManyToManyField(verbose_name='標簽', to='Tag')
    def __str__(self):
        return self.title
    class Meta:
        db_table = 'article'

2、添加admin站點,插入測試數(shù)據

user/admin.py

from django.contrib import admin
from .models import Article, UserInfo, Tag
# Register your models here.
admin.site.register(UserInfo)
admin.site.register(Article)
admin.site.register(Tag)

3、select_related示例查詢

3.1 普通查詢

<h1>article列表</h1>
<body>
<ul>
    {% for article in article_queryset %}
        <li>{{ article.title }} <==> {{ article.title }}</li>
    {% endfor %}
</ul>
</body>
def article_list0(request):
    if request.method == 'GET':
        article_queryset = Article.objects.all()
        return render(request, 'user/t1.html', {'article_queryset': article_queryset})

以上可知:只有一次SQL查詢記錄

3.2 外鍵查詢

<h1>article列表</h1>
<body>
<ul>
    {% for article in article_queryset %}
        <li>{{ article.title }} <==> {{ article.username }}</li>
    {% endfor %}
</ul>
</body>
def article_list(request):
    if request.method == 'GET':
        article_queryset = Article.objects.all()
        return render(request, 'user/t2.html', {'article_queryset': article_queryset})

以上可知:有13次SQL查詢

1次查詢article表,12次查詢article的外鍵

3.3 性能優(yōu)化

<h1>article列表</h1>
<body>
<ul>
    {% for article in article_queryset %}
        <li>{{ article.title }} <==> {{ article.username }}</li>
    {% endfor %}
</ul>
</body>
def article_list2(request):
    if request.method == 'GET':
        article_queryset = Article.objects.all().select_related('username')
        # article_queryset = Article.objects.all().prefetch_related()
        return render(request, 'user/t2.html', {'article_queryset': article_queryset})

以上可知:使用select_related進行優(yōu)化,只有一次SQL查詢

3.4 其他示例

# 獲取id=1的文章對象同時,獲取其相關username信息
Article.objects.select_related('username').get(id=1)
# 獲取id=1的文章對象同時,獲取其相關作者名字信息
Article.objects.select_related('username__username').get(id=1)
# 獲取id=1的文章對象同時,獲取其相關tag和相關作者名字信息。下面方法等同。
# 方式一:
Article.objects.select_related('tag', 'username__username').get(id=1)
# 方式二:
Article.objects.select_related('tag').select_related('username__username').get(id=1)
# 使用select_related()可返回所有相關主鍵信息。all()非必需。
Article.objects.all().select_related()
# 獲取Article信息同時獲取username信息。filter方法和selected_related方法順序不重要。
# 方式一:
Article.objects.filter(tag__gt=3).select_related('username')
# 方式二:
Article.objects.select_related('username').filter(tag__gt=3)

4、prefetch_related示例查詢

對于多對多字段,你不能使用select_related方法,這樣做是為了避免對多對多字段執(zhí)行JOIN操作從而造成最后的表非常大。

prefetch_related()和select_related()的設計目的很相似,都是為了減少SQL查詢的數(shù)量,但是實現(xiàn)的方式不一樣。后者是通過JOIN語句,在SQL查詢內解決問題。但是對于多對多關系,使用SQL語句解決就顯得有些不太明智,因為JOIN得到的表將會很長,會導致SQL語句運行時間的增加和內存占用的增加。若有n個對象,每個對象的多對多字段對應Mi條,就會生成Σ(n)Mi 行的結果表。

4.1 普通查詢

<h1>{{ tag.name }}</h1>
<body>
<ul>
    {% for article in article_list %}
        <li>{{ article.title }}</li>
    {% endfor %}
</ul>
</body>
def tag_list(request, tid):
    if request.method == 'GET':
        tag = Tag.objects.get(pk=tid)
        article_list = tag.article_set.all()
        return render(request, 'user/t4.html', {'tag': tag, 'article_list': article_list})

4.2 性能優(yōu)化

<h1>{{ tag.name }}</h1>
<body>
<ul>
    {% for article in tag.article_set.all %}
        <li>{{ article.title }}</li>
    {% endfor %}
</ul>
</body>
def tag_list1(request, tid):
    if request.method == 'GET':
        tag = Tag.objects.prefetch_related('article_set').get(pk=tid)
        return render(request, 'user/t5.html', {'tag': tag})

到此這篇關于django之select_related、prefetch_related的文章就介紹到這了,更多相關django select_related、prefetch_related內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python中使用pymssql庫操作MSSQL數(shù)據庫

    python中使用pymssql庫操作MSSQL數(shù)據庫

    這篇文章主要給大家介紹了關于python中使用pymssql庫操作MSSQL數(shù)據庫的相關資料,最近在學習python,發(fā)現(xiàn)好像沒有對pymssql的詳細說明,于是乎把官方文檔學習一遍,重要部分做個歸檔,方便以后查閱,需要的朋友可以參考下
    2023-08-08
  • 基于Python+PyQt5+Pandas編寫的帶圖形界面的Excel合并工具

    基于Python+PyQt5+Pandas編寫的帶圖形界面的Excel合并工具

    在日常辦公或數(shù)據處理中,經常會遇到多個 Excel 文件需要合并的場景,手工復制不僅效率低,而且容易出錯,本文將手把手教你使用 Python + PyQt5 + Pandas 編寫一個帶圖形界面的 Excel 合并工具,需要的朋友可以參考下
    2026-01-01
  • 分享Pytest fixture參數(shù)傳遞的幾種方式

    分享Pytest fixture參數(shù)傳遞的幾種方式

    這篇文章主要分享的是Pytest fixture參數(shù)傳遞的幾種方式,文章基于python的相關資料展開對主題的詳細介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-04-04
  • Python 批量操作設備的實現(xiàn)步驟

    Python 批量操作設備的實現(xiàn)步驟

    本文將結合實例代碼,介紹Python 批量操作設備的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2021-07-07
  • Python使用MD5加密字符串示例

    Python使用MD5加密字符串示例

    這篇文章主要介紹了Python使用MD5加密字符串示例,對一些可能出現(xiàn)的錯誤點上本文也給出提醒,需要的朋友可以參考下
    2014-08-08
  • Linux下Pycharm、Anaconda環(huán)境配置及使用踩坑

    Linux下Pycharm、Anaconda環(huán)境配置及使用踩坑

    這篇文章主要介紹了Linux下Pycharm、Anaconda環(huán)境配置及使用踩坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Python開多次方根的案例

    Python開多次方根的案例

    這篇文章主要介紹了Python開多次方根的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Matplotlib實戰(zhàn)之平行坐標系繪制詳解

    Matplotlib實戰(zhàn)之平行坐標系繪制詳解

    平行坐標系是一種統(tǒng)計圖表,它包含多個垂直平行的坐標軸,每個軸表示一個字段,并用刻度標明范圍,下面我們就來看看如何繪制平行坐標系吧
    2023-08-08
  • 復制粘貼功能的Python程序

    復制粘貼功能的Python程序

    接下來,由于我覺得手動復制粘貼這29000條插入語句實在是太痛苦了,所以打算用Python來完成這項工作。這是我第一次自己動手寫Python代碼,感覺還挺順利的。
    2008-04-04
  • python枚舉類型定義與使用講解

    python枚舉類型定義與使用講解

    在python中枚舉是一種類(Enum,IntEnum),存放在enum模塊中。枚舉類型可以給一組標簽賦予一組特定的值,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10

最新評論

千阳县| 闽清县| 湄潭县| 福州市| 聂拉木县| 莱西市| 栾城县| 泗阳县| 玉溪市| 石嘴山市| 阿拉善右旗| 宣汉县| 那曲县| 寿阳县| 大同市| 闻喜县| 临汾市| 定远县| 徐汇区| 平顺县| 突泉县| 天津市| 通州市| 松溪县| 衡山县| 平度市| 磴口县| 油尖旺区| 兰坪| 泸西县| 开江县| 上杭县| 吐鲁番市| 汉中市| 乃东县| 东方市| 灵宝市| 枣强县| 万源市| 镇赉县| 桃江县|