Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:如何处理无法扩展的查询?_Python_Django_Django Models - Fatal编程技术网

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

Python Django:如何处理无法扩展的查询?,python,django,django-models,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()

在我的代码中,有几个查询根本不可伸缩

例如,请查看以下代码:

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)
类OrderQuerySet(query.QuerySet):
日def(自身,日:日期):
“”“返回与给定服务日有关的所有订单”“”
返回自我筛选(服务开始日期=天)

如果
localdate(…)
更高级,您仍然可以尝试在数据库端完成大部分工作。例如,通过将查询集向下过滤到给定日期(例如24小时内)的订单,然后在Python/Django端执行高级过滤。但是,我们的想法是在数据库端尽可能多地执行操作(除非您执行一些在数据库中伸缩性不好的外来查询,但这是非常罕见的)。

localdate(…)在这里做什么?通常,这样的过滤器可以移动到数据库端,从而提高效率。为什么您认为必须在Python中循环?你的回答很有道理。你和@Daniel Roseman告诉我,我可以(几乎)总是在数据库级别进行过滤,而不是在Python中循环。这意味着我可能不知道如何在Django中进行一些高级过滤。此外,我的另一个问题是,我的许多方法在参数中采用Django对象的Python列表,而不是queryset。@DavidD:我认为制作queryset变体是值得的,因为在数据库中进行过滤、注释、连接等通常更有效。事实上,数据库的主要任务之一是过滤、连接等。请注意,queryset是可编辑的,因此您的一些方法可能已经在queryset上工作了。谢谢大家,我会这样做的。当然,举个例子,我这样做对吗?