Как массово обновить объекты в списке - PullRequest
1 голос
/ 02 августа 2020

У меня есть список объектов, которые я обновляю:

membership_list = list(Memberships.objects.all())

for member in membership_list:
    member.status = var # could be 1/2/3 etc
    member.save()

Однако это очень неэффективно, поскольку при 100 членстве он попадает в БД 100 раз. Вместо этого я хочу использовать bulk_update:

for member in membership_list:
    member.status = var # could be 1/2/3 etc
Memberships.object.bulk_update(membership_list)

Однако это явно не работает, поскольку исходный список не обновляется. Какой самый эффективный способ добиться этого?

Я мог бы восстановить список, но это не очень DRY:

another_list = []
for member in membership_list:
    member.status = var # could be 1/2/3 etc
    another_list.append(member)

Memberships.object.bulk_update(another_list)

Есть ли способ лучше?

1 Ответ

2 голосов
/ 02 августа 2020

Это не список , а QuerySet.

Если значение фиксировано, или выражение в терминах какого-либо другого поля (полей), вы можете использовать of update(…) [Django -doc] :

Memberships.objects.all().<b>update(status=1)</b>

Это сгенерирует запрос, который выглядит так:

<b>UPDATE</b> memberships
SET status = 1

Если вы хотите обновить объекты с помощью более сложного выражения, вы можете сначала использовать list(…) для его материализации:

membership_list = <b>list(</b>Membership.objects.all()<b>)</b>
for member in membership_list:
    member.status = 1  # some expression
Memberships.object.bulk_update(membership_list, <b>['status']</b>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...