簡體   English   中英

Django中用於相關操作的數據庫事務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM