2013-06-18 4 views
11

Wie die Django-Dokumentation sagt, gibt select_for_update eine Queryset zurück. Aber get nicht. Jetzt habe ich eine Abfrage, von der ich sicher bin, dass sie nur ein Tupel zurückgibt. Aber ich muss auch Sperren für diese Transaktion erwerben. Also mache ich etwas wie:Wie benutzt man select_for_update um eine Anfrage in Django zu bekommen?

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

Jetzt muss ich einige Werte von ob. Aber ob ist ein Queryset. Das scheint ziemlich einfach, aber schlägt mich. Ich bin ziemlich neu in Django. Ein Ratschlag bitte.

Antwort

14

Rufen Sie einfach get an, schneiden Sie es ab und speichern Sie es wie gewohnt. Die Sperre ist durch die Transaktion vorhanden.

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

Alle Änderungen werden am Ende der Transaktion verpflichtet (die standardmäßig über 1,5 pro-Anfrage)

+0

Also statt mache ich einen Filter, kann ich 'select_for_update()' direkt auf 'get' machen? –

+0

@IndradhanushGupta Nein, die Reihenfolge ist nicht korrekt. Sie verwenden 'get' on' select_for_update() ', da' get' ein Objekt und kein QuerySet zurückgibt. – minmaxavg

9

Sie can auch select_for_update mit get_object_or_404 Funktion:

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 
Verwandte Themen