Стратегии ускорения пакетных операций ORM в Джанго - PullRequest
9 голосов
/ 28 ноября 2008

Один из моих вызовов API может привести к обновлению большого количества объектов (модели Django). У меня возникают проблемы с производительностью, поскольку я обновляю каждый элемент по отдельности, сохраняю и перехожу к следующему:

for item in Something.objects.filter(x='y'):
    item.a="something"
    item.save()

Иногда мой критерий фильтра выглядит как "где х в ('a', 'b', 'c', ...)".

Похоже, официальный ответ на это "не исправит" . Мне интересно, какие стратегии люди используют для повышения производительности в этих сценариях.

Ответы [ 2 ]

15 голосов
/ 28 ноября 2008

Билет, на который вы ссылаетесь, предназначен для массового создания - если вы не полагаетесь на переопределенный метод save или сигналы до / после сохранения для выполнения работы по сохранению, QuerySet имеет update метод , который можно использовать для выполнения UPDATE в отфильтрованных строках:

Something.objects.filter(x__in=['a', 'b', 'c']).update(a='something')
1 голос
/ 28 ноября 2008

Вам необходимо использовать транзакции или создать оператор SQL вручную. Также можно попробовать использовать SQLAlchemy, который поддерживает несколько замечательных функций ORM, таких как Unit of Work (или транзакция приложения).

транзакции Django: http://docs.djangoproject.com/en/dev/topics/db/transactions/?from=olddocs

SQLAlchemy: http://www.sqlalchemy.org/

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