繁体   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