As the Django Documentation says, select_for_update returns a Queryset. But get does not. Now I have a query which I am sure is going to return only one tuple. But I also need to acquire locks for this transaction. So I am doing something like:
ob = MyModel.objects.select_for_update().filter(some conditions)Now, I need to modify some values of ob. But ob is a Queryset. This seems pretty simple, but beats me. I'm pretty new to Django. Some advice please.
Best Answer
Just call get, slice it, etc. and save as usual. The lock is in place through the transaction.
ob = MyModel.objects.select_for_update().get(pk=1)Any changes are committed at the end of the transaction (which by default through 1.5 is per-request)
You can also use select_for_update with get_object_or_404 function:
from django.db import transactionfrom django.shortcuts import get_object_or_404with transaction.atomic():obj = get_object_or_404(MyModel.objects.select_for_update(), pk=pk)# do some stuff with locked objJust after select_for_update().filter(), you can put .first() which returns the 1st object of a queryset to update it with save() as shown below. *You can see my question and answer explaining more about select_for_update() in Django:
# Hereob = MyModel.objects.select_for_update().filter(some conditions).first()ob.field_1 = 'some value'ob.save()