Django QuerySet的select_related()函數__函數

來源:互聯網
上載者:User

轉自panjj 發表於 2010-07-04 11:30

Django擷取資料實體的時候,返回的對象一個實體或多個實體,也就是QuerySet,它是Django專有的東西,具體的理解,它是類似Python的字典的東西,但它並不實現字典的所有方法。今天講解的是它其中的一個函數select_related()。
select_related()使用的情境,是擷取實體的同時,能快速擷取到它對應的外鍵關係實體。如果擷取實體時沒有使用select_related(),要引用該實體的外鍵關係,那麼就會重新串連資料庫去擷取對應實體了。比如 作者Author 部落格Blog 兩個表,他們的關係 是一個作者Author有多個部落格blog,;當我們想擷取到一個作者的同時 直接引用該作者的所有部落格時,常規做法是會進行兩次資料庫連接的,但使用了select_related()後,情況就有所變化了,它第一次串連資料庫擷取該作者的時候,該作者的所有部落格被擷取到了。 比如: author=Author.objects.select_related().get(pk=1)  #擷取id是1的作者; 擷取該部落格的同時已經擷取到該作者的所有部落格 blogs=author.blog #擷取id是1作者的所有部落格blogs  ,這時並不需要串連資料庫擷取那些部落格了。
不使用select_related()時: author=Author.objects.get(pk=1)  #擷取id是1的作者;僅僅擷取該作者的實體 blogs=author.blog #擷取id是1作者的所有部落格blogs  ,但需要串連資料庫擷取該作者的那些部落格。
select_related()提供了一個備選參數depth,執行擷取對象關聯實體的深度。如 select_related(depth=2),這時不僅僅擷取到相關的部落格,還能擷取到部落格的關聯實體,比如部落格的類別(另一個和blog表相對應的表)之類的。如果不指定depth,預設情況將會擷取到該作者的所有關聯對象的 包括關聯對象的子關聯對象。由此可以想象,使用它有利有弊,當自己需要對象相關關聯對象的時候,可以使用它,只是這樣第一次查詢的時候,將進行不少表的操作(要看錶關聯複雜程度)。

所以當我們擷取對象需要它相關聯的對象時,就請用select_related()吧,如果該對象關聯的表很多,請指定depth的值,避免資源的浪費;反之避免select_related()。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.