python - Django:如何处理无法扩展的查询?

标签 python django django-models

在我的代码中,我有一些根本不可扩展的查询。

例如,看一下这段代码:

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.<b>filter(service__start__date=day)</b>

如果localdate(..)更高级,您仍然可以尝试在数据库端完成大部分工作。例如,通过将查询集过滤为给定日期 24 小时内的订单,然后在 Python/Django 端进行高级过滤。但我们的想法是在数据库端做尽可能多的事情(除非您进行一些在数据库中无法很好扩展的奇异查询,但这种情况相当罕见)。

关于python - Django:如何处理无法扩展的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54307211/

相关文章:

python - 在 4×n 网格中绘制子图并共享 y 轴

python - Django 模型无法迁移

Django - 在 __init__ 中添加模型字段验证器

javascript - 如何正确读取 pyarrow 生成的 Apache Arrow Feather 文件?

python - 如何重置 QGridLayout 中小部件的列跨度?

python - 从 Django 管理中删除历史按钮

database - 没有数据库的django模型

python - 提高配置不当的psycopg2(postgresql)

python - Django中 'related_name'和 'related_query_name'属性之间的区别?

python - 在 django-admin 中使用 django 将用户数据导出为 CSV