Уменьшите нагрузку на базу данных с помощью этого свойства модели - PullRequest
0 голосов
/ 29 мая 2011

В моей модели есть следующий код, который определяет, является ли Entry оплачиваемым:

class Entry(models.Model):
    [ .. ]
    @property
    def is_billable(self):
        return self.tags.filter(billable=False).count() == 0

У входа есть FK для Project. При определении оставшегося бюджета для Project я перебираю все записи и проверяю, возвращает ли is_billable True:

@property
def remaining_budget(self):
    [ .. ]
    for entry in self.entry_set.all():
        if entry.is_billable:
            remaining_budget -= entry.minutes

Что довольно тяжело для базы данных, потому что она будет запускать запрос для каждой записи. Я ищу способ оптимизировать это, советы и подсказки приветствуются.

1 Ответ

0 голосов
/ 29 мая 2011

Если вам нужно избавиться от запроса на подсчет, то почему бы и нет:

  1. Добавьте поле is_billable в вашу Entry модель
  2. Пишите сигналы на основе тегаобъекты для установки в это поле значения True или False (если добавлен новый тег с is_billable == True, установите его значение True / если тег удален, а тегов с is_billable == True не осталось, установите значение False и т. д.)

Конечно, если ваши данные могут быть изменены с помощью других приложений или вручную, этот метод не должен быть предпочтительным.

...