我需要确保Model1和Model2都保存,或者两者都没有保存,我很确定我应该能够在事务中执行此操作,但它似乎无法正常工作。
我不确定我是否理解交易如何正常运作。我认为该事务对包装在装饰器中的整个函数调用都有好处。
我也不确定这是否只是一个Sqlite问题。
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。
答案 0 :(得分:1)
所以最后的答案是,交易工作正常,只是我的单元测试不是继承自
https://docs.djangoproject.com/en/1.2/topics/testing/#django.test.TransactionTestCase
由于我只是从TestCase继承而来,每个test_方法都包含在一个事务中,我无法控制.commit()或.rollback()行为。
这只是我完全没有意识到如何运行测试用例。