Джанго: как вы справляетесь с запросами, которые не могут масштабироваться? - PullRequest
0 голосов
/ 22 января 2019

В моем коде у меня есть несколько запросов, которые вообще не масштабируются.

Например, взгляните на этот код:

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.

1 Ответ

0 голосов
/ 22 января 2019

Пожалуйста не перечисляйте более .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 часов с заданным значением date, а затем выполняйте расширенную фильтрацию на стороне Python / Django. Но идея состоит в том, чтобы сделать как можно больше на стороне базы данных (если вы не делаете экзотические запросы, которые плохо масштабируются в базе данных, но это довольно редко).

...