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.
You would use the __search operator. It's documented in the Django QuerySet API Reference. There's also istartswith, which does a case-insensitive starts-with search. Note that __search is only available in MySQL and requires direct manipulation of the database to add the full-text index.
The select_for_update method offered by the Django ORM solves the problem of concurrency by returning a queryset that locks all the rows that belong to this queryset until the outermost transaction it is inside gets committed thus preventing data corruption.
The SELECT command acquires a lock of this mode on referenced tables. In general, any query that only reads a table and does not modify it will acquire this lock mode. Conflicts with the EXCLUSIVE and ACCESS EXCLUSIVE lock modes.
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With