Comment mettre à jour en bloc des objets dans une liste

2020-08-02 python django

J'ai une liste d'objets que je mets à jour:

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

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

Cependant, c'est très inefficace car avec 100 adhésions, il atteint la DB 100 fois. Au lieu de cela, je souhaite utiliser bulk_update :

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

Cependant, cela ne fonctionne évidemment pas, car la liste d'origine n'est pas mise à jour. Quelle est la manière la plus efficace d'y parvenir?

Je pourrais reconstituer la liste, mais cela ne semble pas très SEC:

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)

Y a-t-il un meilleur moyen?

Answers

Ce n'est pas une liste , mais un QuerySet .

Si la valeur est fixe, ou une expression en termes de certains autres champs, vous pouvez utiliser update(…) [Django-doc] :

Memberships.objects.all().update(status=1)

Cela générera une requête qui ressemble à:

UPDATE memberships
SET status = 1

Si vous souhaitez mettre à jour des objets avec une expression plus complexe, vous pouvez d'abord utiliser une list(…) pour la matérialiser:

membership_list = list(Membership.objects.all())
for member in membership_list:
    member.status = 1  # some expression
Memberships.object.bulk_update(membership_list, ['status'])

Related