[英]database tranactions in django for dependent operations
我是Django的新手,並具有以下一些模型定義:
class ProjectModel(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
class Meta:
db_table = "projects"
class StudyModel(models.Model):
project = models.ForeignKey(ProjectModel)
name = models.CharField(max_length=100)
description = models.TextField()
class Meta:
db_table = "studies"
我有一個關聯的視圖,該視圖允許用戶同時創建項目和研究。 我這樣做如下:
pid = ProjectModel.objects.filter(name__iexact=project_name).first()
if pid is None:
try:
#with transaction.atomic():
pobj = ProjectModel.objects.create(name="A", description="")
sobj = StudyModel.objects.create(name="B", description="", project_id=pobj.pk)
except:
#pobj.delete()
#sobj.delete()
return Response(status=status.HTTP_417_EXPECTATION_FAILED)
我一直在考慮如何執行此操作,以便如果任何操作失敗,數據庫將保持不變,即,如果由於某種原因未創建study
則也不會創建project
。
我認為可行的一種方法是在調用objects.create
之前標記方法savepoints
,然后在異常處理程序中回滾。 但是,我不確定這是否是正確的方法。
使用transaction.atomic
(就像您已經注釋掉的一樣)將操作包裝到單個數據庫事務中。
from django.db import DatabaseError, transaction
if pid is None:
try:
with transaction.atomic():
pobj = ProjectModel.objects.create(name="A", description="")
sobj = StudyModel.objects.create(name="B", description="", project_id=pobj.pk)
except DatabaseError:
return Response(status=status.HTTP_417_EXPECTATION_FAILED)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.