2013-06-18 7 views
11

Come dice la documentazione di Django, select_for_update restituisce un Queryset. Ma lo get no. Ora ho una query che sono sicuro restituirà solo una tupla. Ma ho anche bisogno di acquisire serrature per questa transazione. Quindi sto facendo qualcosa del tipo:Come utilizzare select_for_update per "ottenere" una query in Django?

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

Ora ho bisogno di modificare alcuni valori di ob. Ma ob è un Queryset. Sembra piuttosto semplice, ma mi batte. Sono abbastanza nuovo di Django. Alcuni consigli per favore.

risposta

14

Basta chiamare get, tagliarlo, ecc. E salvare come al solito. Il blocco è attivo tramite la transazione.

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

Tutte le modifiche sono impegnati al termine della transazione (che di default attraverso 1.5 è per-richiesta)

+0

Così, invece di facendo un filtro posso fare direttamente 'select_for_update()' su 'get'? –

+0

@IndradhanushGupta No, l'ordine non è corretto. Si usa 'get' su' select_for_update() 'come' get' restituisce un oggetto, non un QuerySet. – minmaxavg

9

Si can utilizzare anche select_for_update con get_object_or_404 funzione:

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 
Problemi correlati