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