Django中基于数据库的依赖操作事务

2024-06-02 07:47:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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,然后在异常处理程序中回滚。然而,我不确定这样做是否正确


Tags: nameprojectmodelobjectsmodelscreatedescriptionlength
1条回答
网友
1楼 · 发布于 2024-06-02 07:47:07

使用^{}(就像您已经注释掉的那样)将操作包装到单个数据库事务中

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)

相关问题 更多 >