Moved the database transaction control from the save() method in the data model to the form view, to avoid double transactions.

This commit is contained in:
依瑪貓 2020-08-24 22:26:07 +08:00
parent 04703df6b5
commit 926d61f534
2 changed files with 17 additions and 18 deletions

View File

@ -178,17 +178,16 @@ class Transaction(DirtyFieldsMixin, BaseModel):
for record in to_save:
record.current_user = self.current_user
# Runs the update
with transaction.atomic():
super().save(force_insert=force_insert, force_update=force_update,
using=using, update_fields=update_fields)
for record in to_delete:
record.delete()
for record in to_save:
record.save(force_insert=force_insert,
force_update=force_update,
using=using, update_fields=update_fields)
for x in txn_to_sort:
Transaction.objects.filter(pk=x[0].pk).update(ord=x[1])
super().save(force_insert=force_insert, force_update=force_update,
using=using, update_fields=update_fields)
for record in to_delete:
record.delete()
for record in to_save:
record.save(force_insert=force_insert,
force_update=force_update,
using=using, update_fields=update_fields)
for x in txn_to_sort:
Transaction.objects.filter(pk=x[0].pk).update(ord=x[1])
def delete(self, using=None, keep_parents=False):
txn_same_day = list(
@ -199,12 +198,10 @@ class Transaction(DirtyFieldsMixin, BaseModel):
for i in range(len(txn_same_day)):
if txn_same_day[i].ord != i + 1:
txn_to_sort.append([txn_same_day[i], i + 1])
with transaction.atomic():
for record in self.record_set.all():
record.delete()
super().delete(using=using, keep_parents=keep_parents)
for x in txn_to_sort:
Transaction.objects.filter(pk=x[0].pk).update(ord=x[1])
Record.objects.filter(transaction=self).delete()
super().delete(using=using, keep_parents=keep_parents)
for x in txn_to_sort:
Transaction.objects.filter(pk=x[0].pk).update(ord=x[1])
def fill_from_post(self, post: Dict[str, str], request: HttpRequest,
txn_type: str):

View File

@ -24,6 +24,7 @@ from dirtyfields import DirtyFieldsMixin
from django import forms
from django.contrib import messages
from django.contrib.messages.views import SuccessMessageMixin
from django.db import transaction
from django.db.models import Model
from django.http import HttpResponse, HttpRequest, \
HttpResponseRedirect, Http404
@ -157,7 +158,8 @@ class FormView(View):
and not self.object.is_dirty(check_relationship=True):
message = self.get_not_modified_message(form.cleaned_data)
else:
self.object.save()
with transaction.atomic():
self.object.save()
message = self.get_success_message(form.cleaned_data)
messages.success(self.request, message)
return redirect(str(UrlBuilder(self.get_success_url())