web-dev-qa-db-fra.com

Comment utiliser select_for_update pour 'obtenir' une requête dans Django?

Comme le dit la documentation Django Documentation, select_for_update renvoie un Queryset. Mais get ne fonctionne pas. Maintenant, j'ai une requête qui, je suis sûr, ne renverra qu'un seul tuple. Mais j'ai également besoin d'acquérir des verrous pour cette transaction. Je fais donc quelque chose comme:

ob = MyModel.objects.select_for_update().filter(some conditions)

Maintenant, je dois modifier certaines valeurs de ob. Mais ob est un Queryset. Cela semble assez simple, mais me bat. Je suis assez nouveau pour Django. Quelques conseils s'il vous plaît.

25
Indradhanush Gupta

Appelez simplement get, découpez-le, etc. et enregistrez comme d'habitude. Le verrou est en place pendant la transaction.

ob = MyModel.objects.select_for_update().get(pk=1)

Toutes les modifications sont validées à la fin de la transaction (qui par défaut jusqu'à 1.5 est par demande)

33

Vous pouvez utilisez également select_for_update avec get_object_or_404 fonction:

from Django.db import transaction
from Django.shortcuts import get_object_or_404

with transaction.atomic():
    obj = get_object_or_404(MyModel.objects.select_for_update(), pk=pk)
    # do some stuff with locked obj
24
Omid Raha