2016-11-24 2 views
0

Я новичок в Django и есть некоторые определения модели следующим образом:tranactions базы данных в Джанго для зависимых операций

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 не также создан.

В одном из способов я подумал, что это возможно отметить метод savepoints перед вызовом objects.create, а затем откат в обработчике исключений. Однако я не уверен, что это правильный способ сделать это.

ответ

1

Использовать 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) 
+0

ОК, поэтому, я думаю, мне не нужно беспокоиться о разворачивании ... Это давало ошибки раньше, но я понял, что это происходит из другого источника ... – Luca