在我的代码中,我有一些根本不可扩展的查询。
例如,看一下这段代码:
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/