2013-06-18 33 views
11

Như Tài liệu Django cho biết, select_for_update trả về một Queryset. Nhưng get thì không. Bây giờ tôi có một truy vấn mà tôi chắc chắn sẽ trả lại chỉ một tuple. Nhưng tôi cũng cần phải có được khóa cho giao dịch này. Vì vậy, tôi đang làm một cái gì đó như:Làm thế nào để sử dụng select_for_update để 'có được' một truy vấn trong Django?

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

Bây giờ tôi cần phải sửa đổi một số giá trị của ob. Nhưng ob là Queryset. Điều này có vẻ khá đơn giản, nhưng đánh tôi. Tôi khá mới với Django. Một số lời khuyên xin vui lòng.

Trả lời

14

Chỉ cần gọi get, cắt lát, v.v ... và lưu như bình thường. Khóa được đặt qua giao dịch.

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

Mọi thay đổi cam kết vào cuối của giao dịch (mà theo mặc định thông qua 1,5 là mỗi yêu cầu)

+0

Vì vậy, thay vì làm một bộ lọc tôi có thể trực tiếp làm 'select_for_update()' trên 'get'? –

+0

@IndradhanushGupta Không, lệnh không đúng. Bạn sử dụng 'get' trên' select_for_update() 'như' get' trả về một đối tượng, không phải là một QuerySet. – minmaxavg

9

Bạn can cũng sử dụng select_for_update với get_object_or_404 chức năng:

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 
Các vấn đề liên quan