Nel Django 1.5- giorni, se volevo gestire manualmente le transazioni (o transazioni all'interno transazioni), vorrei fare qualcosa di simile:Django 1.6 - "Il blocco" atomico "più esterno non può utilizzare savepoint = False quando l'autocommit è disattivato."
@transaction.commit_manually
def my_method():
master_sid = transaction.savepoint()
for item in things_to_process:
inner_sid = transaction.savepoint()
# Make changes, save models, etc.
...
if I_want_to_keep_this_iterations_changes:
transaction.savepoint_commit(inner_sid)
else:
transaction.savepoint_rollback(inner_sid)
if I_want_to_keep_all_un_rolled_back_changes_from_loop:
transaction.savepoint_commit(master_sid)
else:
transaction.savepoint_rollback(master_sid)
Se ho la comprensione the Django docs correttamente, quando l'aggiornamento a Django 1.6 +, dovrei cambiare quanto sopra a qualcosa di simile:
def my_method():
transaction.set_autocommit(False)
try:
# Same code as above
finally:
transaction.set_autocommit(True)
Tuttavia, in Django 1.6+, se si chiama model.save() mentre autocommit è false, Django genererà il seguente errore:
TransactionManagementError: The outermost 'atomic' block cannot use savepoint = False when autocommit is off.
Quindi, come faccio a salvare un modello mentre l'autocommit è falso? Qual è la sostituzione moderna per il mio vecchio codice Django 1.5?
Usa @ transaction.atomic sul metodo – GrvTyagi