gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:16:23 25 4
gpt4 key购买 nike

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

例如,看一下这段代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com