簡體   English   中英

需要 Django 查詢優化(2 個查詢而不是 21 個)

[英]Need Django Query optimization (2 Queries instead of 21)

我在 EBS 上有一個 Django 項目,一種返回Article對象的 QuerySet 的方法需要很長時間。 我想優化它,讓它只是一兩個查詢,但我不確定它是否可能。

模型: WebSiteArticle

查詢是來自不同網站的Articles列表。

WebSite model 有一個home_orderhome_article_count屬性,用於 select 一些文章以及它們的順序。

以網站 A、B 和 C 為例:

  1. A - A.home_order = 2 , A.home_article_count=3
  2. B - B.home_order = 1 , B.home_article_count=5
  3. C - C.home_order = 3 , C.home_article_count=7

結果將是(aA 表示來自網站 A 的文章):

aB,aB,aB,aB,aB,aA,aA,aA,aC,aC,aC,aC,aC,aC,aC

列表以aB開頭,表示來自網站B的文章,因為B.home_order=1 ,有 5 篇aB文章,如B.home_article_count=5

現在,這是一個返回文章的Manager方法:

def home(self) -> QuerySet:
    articles_pks = []
    for ws in WebSite.objects.active().order_by('home_order', 'name'):
        articles_pks.extend(ws.articles.filter(is_active=True).order_by('-created')[:ws.home_article_count].values_list('pk',flat=True))
    return self.get_queryset().filter(pk__in=articles_pks)

這意味着,對於 20 個 WebSite 對象,有 21 個查詢(一個獲取網站,另外 20 個獲取文章)。

是否可以在尊重WebSite.home_orderWebSite.home_article_count的同時將其合並為一個或兩個查詢?

嘗試使用OR |組合查詢集操作員:

def home(self) -> QuerySet:
    articles_pks = Article.objects.none()
    for ws in WebSite.objects.active().order_by('home_order', 'name'):
        articles_pks = articles_pks | ws.articles.filter(is_active=True).order_by('-created')[:ws.home_article_count]
    return self.get_queryset().filter(pk__in=articles_pks.values_list('pk',flat=True)))

您最終應該只有兩個查詢,一個用於獲取網站,一個用於構建和使用文章列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM