使用事务确保2个模型保存或不保存

时间:2013-03-06 22:39:26

标签: django sqlite transactions

我需要确保Model1和Model2都保存,或者两者都没有保存,我很确定我应该能够在事务中执行此操作,但它似乎无法正常工作。

我不确定我是否理解交易如何正常运作。我认为该事务对包装在装饰器中的整个函数调用都有好处。

我也不确定这是否只是一个Sqlite问题。

models.py

from django.db import models
class Model1( models.Model ):
    name = models.CharField( max_length = 20 )
    number = models.IntegerField( )

class Model2( models.Model ):
    name = models.CharField( max_length = 20 )
    number = models.IntegerField( )
    parent = models.ForeignKey( Model1 )

示例交易代码

from django.db import transaction

@transaction.commit_manually
def somefunction( name ):
    try:
        a = Model1.objects.get( name = name )
    except Model1.DoesNotExist:
        a = Model1( name = name )

    try:
        b = Mode2.objects.get( name = name)
    except Model2.DoesNotExist:
        b = Model2( name = name )

    a.number = 3
    b.number = 'a'

    try:
        a.save()
        b.parent = a
        b.save()
        transaction.commit()
    except:
        transaction.rollback()

我没有尝试过MySQL或Postgres,因为我实际上没有发现任何具体的说Sqlite不能这样做,所以只想知道我做错了什么或者确实是Sqlite3。

1 个答案:

答案 0 :(得分:1)

所以最后的答案是,交易工作正常,只是我的单元测试不是继承自

https://docs.djangoproject.com/en/1.2/topics/testing/#django.test.TransactionTestCase

由于我只是从TestCase继承而来,每个test_方法都包含在一个事务中,我无法控制.commit()或.rollback()行为。

这只是我完全没有意识到如何运行测试用例。