簡體   English   中英

Django:您如何處理無法擴展的查詢?

[英]Django: how do you deal with queries that can not scale?

在我的代碼中,我有一些根本無法擴展的查詢。

例如,看下面的代碼:

class OrderQuerySet(query.QuerySet):
    def for_day(self, day: date):
        """ Return all orders that concerns the given service day """

        day_order_pks = [order.pk for order in self.all()
                         if localdate(order.service.start) == day]
        return self.filter(pk__in=day_order_pks)

剛開始時,它運行良好。 問題是,當訂單數量增加時,性能似乎呈線性下降,這是有道理的,因為每次都需要測試所有訂單。 每天有1000個新訂單,很明顯,我的系統將在短時間內無法使用!

通常,您如何在Django中處理此類問題?

我的意思是,有時我可以找到一個技巧,僅使用Django ORM編寫更好的查詢。 但是有時候,為了得到我想要的東西,我似乎不得不使用Python和for循環以這種方式創建查詢集。

除非絕對必要,否則請不要列舉.all() 在數據庫端進行過濾更有效。 給定localdate(..)並不會做很多事情,除了從datetime提取日期外,您可以使用以下方法進行過濾:

class OrderQuerySet(query.QuerySet):

    def for_day(self, day: date):
        """ Return all orders that concerns the given service day """
        return self.filter(service__start__date=day)

如果localdate(..)更高級,您仍然可以嘗試在數據庫端完成大部分工作。 例如,通過將查詢集過濾為給定date 24小時內的訂單,然后在Python / Django端進行高級過濾。 但是,這樣做的想法是在數據庫端盡可能多地執行操作(除非您進行一些在數據庫中無法很好擴展的奇異查詢,但這很少見)。

暫無
暫無

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

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