[英]Need Django Query optimization (2 Queries instead of 21)
我在 EBS 上有一個 Django 項目,一種返回Article
對象的 QuerySet 的方法需要很長時間。 我想優化它,讓它只是一兩個查詢,但我不確定它是否可能。
模型: WebSite
, Article
查詢是來自不同網站的Articles
列表。
WebSite
model 有一個home_order
和home_article_count
屬性,用於 select 一些文章以及它們的順序。
以網站 A、B 和 C 為例:
A
- A.home_order = 2
, A.home_article_count=3
B
- B.home_order = 1
, B.home_article_count=5
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_order
和WebSite.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.