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

Django中select_related和prefetch_related的用法與區(qū)別詳解

 更新時(shí)間:2022年11月02日 10:36:06   作者:騎臺(tái)風(fēng)走  
在實(shí)際的開發(fā)中,模型之間經(jīng)常存在復(fù)雜的關(guān)聯(lián)關(guān)系,下面這篇文章主要給大家介紹了關(guān)于Django中select_related和prefetch_related的用法與區(qū)別的相關(guān)資料,需要的朋友可以參考下

0. 本文借助django-debug-toolbar來(lái)展現(xiàn)效果

django-debug-toolbar的安裝

1. 介紹

select_related:

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

prefetch_related

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

Django提供了prefect_related方法來(lái)解決這個(gè)問(wèn)題。

prefect_related可用于多對(duì)多關(guān)系字段,也可用于反向外鍵關(guān)系(related_name)。

相同點(diǎn):

都作用于queryset對(duì)象上面

注意點(diǎn):

  • 對(duì)與單對(duì)單或單對(duì)多外鍵ForeignKey字段,使用select_related方法
  • 對(duì)于多對(duì)多字段和反向外鍵關(guān)系,使用prefetch_related方法
  • 兩種方法均支持雙下劃線指定需要查詢的關(guān)聯(lián)對(duì)象的字段名
  • 使用Prefetch方法可以給prefetch_related方法額外添加額外條件和屬性。

2. 使用

from django.db import models
 
class UserInfo(models.Model):
    username = models.CharField(verbose_name='用戶名', max_length=225)
 
    def __str__(self):
        return self.username
 
class Tag(models.Model):
    name = models.CharField(verbose_name='標(biāo)簽名稱', max_length=225)
 
    def __str__(self):
        return self.name
 
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

2.1 原生的查詢

2.1.1 代碼

def article_list(request):
    if request.method == 'GET':
        # select_related---->queryset
        article_queryset = models.Article.objects.all()
        return render(request, 't2.html', context={'article_queryset': article_queryset})

2.1.2 圖示

2.1.3 查詢解釋 

1.從圖示我們可以看出來(lái),一共進(jìn)行13次查詢,且有10次重復(fù)的!?。?/p>

原因是:當(dāng)我們第一次查詢時(shí),返回的值,只有文章對(duì)象,對(duì)于標(biāo)簽以及用戶,并沒(méi)有查詢,當(dāng)前端界面需要這兩個(gè)時(shí),每循環(huán)一次,就會(huì)去數(shù)據(jù)庫(kù)查詢一次

2.為了避免重復(fù)查詢,django提供select_related和prefetch_related方法來(lái)提升數(shù)據(jù)庫(kù)查詢效率,類似于SQL的JOIN方法。

3.效果就是當(dāng)?shù)谝淮尾樵儠r(shí),進(jìn)行連表,一次性把所有數(shù)據(jù)全部查詢到

2.2 使用select_related

2.2.2 代碼

from django.shortcuts import render
 
from blog import models
 
 
def article_list(request):
    if request.method == 'GET':
        # select_related---->queryset
        article_queryset = models.Article.objects.all().select_related('tag', 'username')
        return render(request, 't2.html', context={'article_queryset': article_queryset})

2.2.3 圖示

 2.2.4 解釋

可以看到現(xiàn)在只有三次查詢,耗時(shí)大大減少

 2.2.5 其他常用用法

# 獲取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)

2.3. 使用prefetch_related方法

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

2.3.1 常用的案例

articles = Article.objects.all().select_related('category').prefecth_related('tags')
 
# 文章列表及每篇文章的tags對(duì)象名字信息
Article.objects.all().prefetch_related('tags__name')
 
# 獲取id=13的文章對(duì)象同時(shí),獲取其相關(guān)tags信息
Article.objects.prefetch_related('tags').get(id=13)
 
# 獲取文章列表及每篇文章相關(guān)的名字以P開頭的tags對(duì)象信息
Article.objects.all().prefetch_related(
    Prefetch('tags', queryset=Tag.objects.filter(name__startswith="P"))
)
 
# 文章列表及每篇文章的名字以P開頭的tags對(duì)象信息, 放在article_p_tag列表
Article.objects.all().prefetch_related(
    Prefetch('tags', queryset=Tag.objects.filter(name__startswith="P")),
to_attr='article_p_tag'
)

本文參考

Django基礎(chǔ)(29): select_related和prefetch_related的用法與區(qū)別

http://www.fzitv.net/article/266493.htm

http://www.fzitv.net/article/266498.htm

總結(jié)

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

相關(guān)文章

  • 手把手教你Python抓取數(shù)據(jù)并可視化

    手把手教你Python抓取數(shù)據(jù)并可視化

    很多小伙伴在提到python數(shù)據(jù)可視化的時(shí)候第一反應(yīng)就是matplotlib庫(kù),但實(shí)際上python還有很多很好用的數(shù)據(jù)可視化的庫(kù),下面這篇文章主要給大家介紹了關(guān)于如何利用Python抓取數(shù)據(jù)并可視化的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • 解決Djang2.0.1中的reverse導(dǎo)入失敗的問(wèn)題

    解決Djang2.0.1中的reverse導(dǎo)入失敗的問(wèn)題

    今天小編就為大家分享一篇解決Djang2.0.1中的reverse導(dǎo)入失敗的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • python中opencv?Canny邊緣檢測(cè)

    python中opencv?Canny邊緣檢測(cè)

    這篇文章主要介紹了python中opencv?Canny邊緣檢測(cè),Canny邊緣檢測(cè)是一種使用多級(jí)邊緣檢測(cè)算法檢測(cè)邊緣的方法。OpenCV提供了函數(shù)cv2.Canny()實(shí)現(xiàn)Canny邊緣檢測(cè)。更多相關(guān)內(nèi)容需要的小伙伴可以參考下面文章內(nèi)容
    2022-06-06
  • Python爬蟲beautifulsoup4常用的解析方法總結(jié)

    Python爬蟲beautifulsoup4常用的解析方法總結(jié)

    今天小編就為大家分享一篇關(guān)于Python爬蟲beautifulsoup4常用的解析方法總結(jié),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • Flask框架鉤子函數(shù)功能與用法分析

    Flask框架鉤子函數(shù)功能與用法分析

    這篇文章主要介紹了Flask框架鉤子函數(shù)功能與用法,簡(jiǎn)單描述了flask框架鉤子函數(shù)的概念、功能并結(jié)合實(shí)例形式分析了flask框架鉤子函數(shù)的基本用法,需要的朋友可以參考下
    2019-08-08
  • 使用Python加密和解密PDF文件

    使用Python加密和解密PDF文件

    在日常工作和生活中,保護(hù)PDF文件的隱私和安全至關(guān)重要,Python提供了一些強(qiáng)大的庫(kù),使得加密和解密PDF文件變得相對(duì)簡(jiǎn)單,本文將詳細(xì)介紹如何使用PyPDF2庫(kù)來(lái)加密和解密PDF文件,需要的朋友可以參考下
    2025-03-03
  • pytorch模型的定義、修改、讀取、斷點(diǎn)續(xù)訓(xùn)深入解析

    pytorch模型的定義、修改、讀取、斷點(diǎn)續(xù)訓(xùn)深入解析

    模型定義是深度學(xué)習(xí)中重要的一環(huán),PyTorch提供了強(qiáng)大而靈活的工具和函數(shù),使我們能夠輕松定義各種類型的深度學(xué)習(xí)模型,通過(guò)深入理解模型定義的原理和應(yīng)用,我們能夠更好地理解和設(shè)計(jì)自己的模型,從而提升深度學(xué)習(xí)任務(wù)的性能和效果
    2024-03-03
  • JupyterNotebook 如何調(diào)整輸出窗口的顯示效果

    JupyterNotebook 如何調(diào)整輸出窗口的顯示效果

    這篇文章主要介紹了JupyterNotebook 輸出窗口的顯示效果調(diào)整實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Python 數(shù)據(jù)化運(yùn)營(yíng)之KMeans聚類分析總結(jié)

    Python 數(shù)據(jù)化運(yùn)營(yíng)之KMeans聚類分析總結(jié)

    這篇文章主要介紹了Python 數(shù)據(jù)化運(yùn)營(yíng)KMeans聚類相關(guān)的一些總結(jié),感興趣的話一起來(lái)閱讀下文吧
    2021-08-08
  • Pytorch中的Broadcasting問(wèn)題

    Pytorch中的Broadcasting問(wèn)題

    這篇文章主要介紹了Pytorch中的Broadcasting問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01

最新評(píng)論

枣强县| 新巴尔虎右旗| 应用必备| 娱乐| 格尔木市| 临泉县| 滨海县| 额济纳旗| 汶川县| 娄烦县| 云林县| 利辛县| 云霄县| 旬邑县| 宾川县| 南丰县| 阳西县| 宽甸| 紫金县| 鲁山县| 东台市| 集安市| 扎囊县| 贵州省| 留坝县| 林口县| 平阴县| 靖边县| 东平县| 巴东县| 阜阳市| 南川市| 和政县| 平江县| 吉林市| 忻城县| 屏东市| 西盟| 蓬莱市| 威远县| 类乌齐县|