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

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

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

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

select_related:

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

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='標(biāo)簽名稱', max_length=225)
    def __str__(self):
        return self.name
    class Meta:
        db_table = 'tag'
class Article(models.Model):
    title = models.CharField(verbose_name='標(biāo)題', max_length=225)
    content = models.CharField(verbose_name='內(nèi)容', max_length=225)
    # 外鍵
    username = models.ForeignKey(verbose_name='用戶', to='UserInfo', on_delete=models.DO_NOTHING)
    tag = models.ManyToManyField(verbose_name='標(biāo)簽', to='Tag')
    def __str__(self):
        return self.title
    class Meta:
        db_table = 'article'

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

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進(jìn)行優(yōu)化,只有一次SQL查詢

3.4 其他示例

# 獲取id=1的文章對(duì)象同時(shí),獲取其相關(guān)username信息
Article.objects.select_related('username').get(id=1)
# 獲取id=1的文章對(duì)象同時(shí),獲取其相關(guān)作者名字信息
Article.objects.select_related('username__username').get(id=1)
# 獲取id=1的文章對(duì)象同時(shí),獲取其相關(guān)tag和相關(guān)作者名字信息。下面方法等同。
# 方式一:
Article.objects.select_related('tag', 'username__username').get(id=1)
# 方式二:
Article.objects.select_related('tag').select_related('username__username').get(id=1)
# 使用select_related()可返回所有相關(guān)主鍵信息。all()非必需。
Article.objects.all().select_related()
# 獲取Article信息同時(shí)獲取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示例查詢

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

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

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})

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

    Python使用MD5加密字符串示例

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

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

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

    Python開多次方根的案例

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

    Matplotlib實(shí)戰(zhàn)之平行坐標(biāo)系繪制詳解

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

    復(fù)制粘貼功能的Python程序

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

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

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

最新評(píng)論

镶黄旗| 垦利县| 晋宁县| 巢湖市| 儋州市| 华亭县| 漯河市| 汪清县| 台南县| 大渡口区| 安达市| 平谷区| 隆化县| 灌南县| 呼伦贝尔市| 宜都市| 永年县| 海伦市| 辽源市| 自贡市| 东光县| 个旧市| 洛川县| 宁城县| 集安市| 青铜峡市| 维西| 界首市| 凤山县| 松潘县| 广安市| 新邵县| 全椒县| 全椒县| 青阳县| 万源市| 彰化市| 湄潭县| 丰镇市| 盱眙县| 长宁县|